每次使用SQL语句 *** 作数据库的时候都需要创建一个与数据库的连接,使用完之后再把这个连接销毁掉,这种频繁创建与销毁比较耗费机器的性能跟资源,也没有太大意义。数据库连接可以解决该问题。
数据库连接池是什么?备注:建立一个数据库连接是一件非常耗时(消耗时间)耗力(消耗资源)的事情。之所以会这样,是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道(例如套接字或命名管道),与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等等。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库 *** 作的性能。
数据库连接池做了什么数据库连接池是一个容器(集合)——存放数据库连接的容器。
1、当系统初始化好后,容器被创建,容器中会申请/存放一些连接对象,
2、当用户访问数据库(需要连接数据库时),从池/容器中获取空闲的连接对象,而不是新建一条连接
3、用户访问完之后,会将连接对象归还给容器。
备注1:整个过程,这些连接都不会被关闭,而是不断的被循环使用,从而节约了启动和关闭连接的时间。(用空间换时间)
1、导入jar包【druid】
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.2.8version>
dependency>
2、创建druid.properties配置文件(resoureces目录下)
driverClassName=com.mysql.cj.jdbc.Driver
#URL连接数据库的URL,其中travel(以下面例子来说)为连接的数据库,后面的参数可不改但不删
url=jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
characterEncoding=utf-8
#安装mysql时候设置的用户与密码
username=root
password=123456
#初始化物理连接的个数
initialSize=5
#最大连接池数量
maxActive=10
#获取连接时最大等待时间
maxWait=3000
#用来检测连接是否有效的sql
validationQuery=SELECT 1
#保证安全性!
testWhileIdle=true
3、代码实现
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
public class DruidTest {
public static void main(String[] args) throws Exception {
/**1、加载配置文件
* a)创建Properties类对象
*说明:Properties(Java.util.Properties),该类主要用于读取Java的配置文件
* b)通过反射获取类加载器-加载文件(获得输入流)
* c)读取文件
*/
Properties pro = new Properties();
InputStream is = DruidTest.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//2、获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
//3、获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
//4、归还连接(不是销毁而是还给连接池)
connection.close();
}
}
优点:节约资源,高效
数据库连接:容器提供连接,使用完毕后归还连接,等待下一次使用
但是,每次使用都自己需要手动向连接池申请连接、需要自己手动归还资源。
我们可以使用JDBCTemplate(模板)来自动帮我们获取数据库连接池的连接、释放资源,为你提供了一些关于sql语句的方法。
实现功能:
- 1、自动注册驱动、自动给参数赋值(URl定位配置文件)
- 2、提供连接数据库连接方法(static已经赋值了配置文件的参数)
- 3、提供释放资源方法——close
这里是引用
//1. 抽取注册驱动的代码 (使用静态代码块)
private static String driver;
private static String url;
private static String user;
private static String password;
static{
try{
//(URL,USER,PASSWORD,DRIVER是需要修改的内容,可以都放入配置文件内,然后将配置文件放在**src**文件下)
//1. 创建Properties对象
Properties pro = new Properties();
//2. 加载配置文件
ClassLoader cl = JDBCUTils.class.getClassLoader();
InputStream is=cl.getResourceAsStream("jdbc.properties");
pro.load(is);
//3. 获取数据并赋值
//注意:key值都要和配置文件的一一对应
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4. 替换数据
/*将“com.mysql.jdbc.Driver”替换为driver;
将“jdbc:mysql://localhost:3306/myjdbc”替换为url;
将”root”替换为user;
将”root”替换为password;*/
Class.forName("com.mysql.jdbc.Driver");
}catch(SQLException e){
e.printStackTrace();
}
}
//2. 抽取获取连接对象的方法
public static Connection getConnection(){
return DriverManager.getConnection("jdbc:mysql://localhost:3306/myjdbc","root","密码")
}
//3. 抽取释放资源的方法
public static void close(Connection conn,Statement stmt){
if(stmt != null){
try{
stmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
public static void close(ResultSet rs,Connection conn,Statement stmt){
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
close(conn,stmt);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)