数据库连接池
(1)数据库连接池的概念
- 其实就是一个容器(集合) , 存放数据库连接的容器
- 当系统初始化好后 , 容器被创建 , 容器中会申请一些连接对象 , 当用户来访问数据库时 , 从容器中获取连接对象 , 用户访问完之后 , 会将连接对象归还给容器
- 好处 :
- 1.节约资源
- 2.用户访问高效
- 好处 :
(2)数据库连接池的实现
-
标准接口 :
- DataSource javax.sql包下的
-
方法 :
-
获取连接 :
-
getConnection()
-
归还连接 :
-
//如果连接对象Connection是从连接池中获取的 , 那么调用 Connection.close(); //方法 , 就不会再关闭连接了 , 而是把连接归还了
-
(3)C3P0 : 数据库连接池技术(比较老的)
1.步骤 :
- 导入jar包 : c3p0-0.9.5.2.jar
- 导入依赖 : mchange-commons-java-0.2.12.jar
2.定义配置文件 :
-
名称 : 必须是c3p0.properties 或者 c3p0-config.xml
-
路径 : 直接将文件放在src目录下即可
-
修改对应的参数即可
-
<?xml version="1.0" encoding="utf-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/aisichen</property> <property name="user">root</property> <property name="password">acpl159357</property> <!-- 连接池参数 --> <!--初始化申请的链接数量--> <property name="initialPoolSize">5</property> <!--最大的链接数量--> <property name="maxPoolSize">10</property> <!--超时时间 ms--> <property name="checkoutTimeout">3000</property> </default-config> <named-config name="otherc3p0"> </named-config> </c3p0-config>
3.创建核心对象 , 数据库连接池对象 (ComboPooledDataSource) (CPDS)
4.获取连接 : getConnection()
package com.sichen.java.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo1 {
public static void main(String[] args) throws SQLException {
//1.创建数据库连接对象
ComboPooledDataSource ds = new ComboPooledDataSource();
//2.获取连接对象
Connection conn = ds.getConnection();
//打印
System.out.println(conn);
}
}
(4)Druid : 数据库连接池技术 (阿里巴巴)
1.步骤 :
-
1.导入jar包 druid-x.x.x.jar
-
2.定义配置文件
-
是properties形式的文件
-
可以叫任意名称 , 可以放在任意目录下 (也就是说 , 这需要你手动去加载)
-
druid.properties
-
driverClassName = com.mysql.cj.jdbc.Driver url = jdbc:mysql://localhost:3306/aisichen username = root password = acpl159357 #初始化的链接数量 initialSize = 5 #最大连接数 maxActive = 10 #超时时间 maxWait = 3000 filters=stat #每60秒运行一次空闲连接回收器 timeBetweenEvictionRunsMillis=60000 #池中的连接空闲30分钟后被回收,默认值就是30分钟。 minEvictableIdleTimeMillis=1800000 #验证连接是否可用,使用的SQL语句 validationQuery=SELECT 1 #指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除. testWhileIdle=true #借出连接时不要测试,否则很影响性能 testOnBorrow=false testOnReturn=false poolPreparedStatements=false maxPoolPreparedStatementPerConnectionSize=200 #在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值就是3. numTestsPerEvictionRun=3
解释: 配置timeBetweenEvictionRunsMillis = "30000"后,每30秒运行一次空闲连接回收器(独立线程)。并每次检查3个连接,如果连接空闲时间超过30分钟就销毁。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接,维护数量不少于minIdle,过行了新老更替。 testWhileIdle = "true" 表示每30秒,取出3条连接,使用validationQuery = "SELECT 1" 中的SQL进行测试 ,测试不成功就销毁连接。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接。 testOnBorrow = "false" 一定要配置,因为它的默认值是true。false表示每次从连接池中取出连接时,不需要执行validationQuery = "SELECT 1" 中的SQL进行测试。若配置为true,对性能有非常大的影响,性能会下降7-10倍。所在一定要配置为false. 每30秒,取出numTestsPerEvictionRun条连接(本例是3,也是默认值),发出"SELECT 1" SQL语句进行测试 ,测试过的连接不算是“被使用”了,还算是空闲的。连接空闲30分钟后会被销毁
-
-
3.加载配置文件
-
//①加载配置文件 Properties properties = new Properties(); //②通过此类的字节码文件获取配置文件的字节输入流 InputStream is = druidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); //③将配置文件中的属性名和属性值装载到properties对象中 properties.load(is);
-
4.获取数据库连接池对象 : 通过一个工厂类来获取
-
DruidDataSourceFactory.createDataSource(properties);
-
-
5.获取连接 : getConnection();
-
最终结果 :
-
package com.sichen.java; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.util.Properties; public class druidDemo { public static void main(String[] args) throws Exception { //加载配置文件 Properties properties = new Properties(); InputStream is = druidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(is); //获取连接对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); Connection connection = dataSource.getConnection(); System.out.println(connection); } }
2.定义一个Druid工具类
(1)定义一个类 JDBCUtils
(2)提供静态代码块 加载配置文件 , 初始化连接池对象
(3)提供方法 :
- ①获取连接方法 : 通过数据库连接池获取连接
- ②释放资源
- ③获取连接池的方法
package com.sichen.java.Util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* Druid连接池的工具类
*/
public class JDBCUtils {
//定义一个成员变量 DataSource
private static DataSource ds;
static{
try {
//1.加载配置文件
Properties properties = new Properties();
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(is);
//2.获取DataSource 连接池对象
ds = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接的方法 , 这里可能会发生异常 , 抛出异常
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 获取连接池的方法 , 用来在监听器中关闭连接池
*/
public static DataSource getDataSource(){
return ds ;
}
}
on() throws SQLException {
return ds.getConnection();
}
/**
* 获取连接池的方法 , 用来在监听器中关闭连接池
*/
public static DataSource getDataSource(){
return ds ;
}
}
[外链图片转存中...(img-WSfb6fe3-1646802457352)]