c3p0和druid数据库连接池
前言
| 编程知识点繁多,许多文章又是用专业名词来解释专业名词,对我这种小白十分不友好,今天用大白话简单整理下数据库连接池技术。
简介
传统jdbc
| java里传统连接数据库是用的jdbc,这个大大滴不好,因为要反复连接反复释放,特别浪费资源,
啥是连接池
对于重复利用的共享资源,建议使用资源池设计模式(Resource Pool),就是先在池子中放几个连接,谁用谁拿,用完放回去,就不用反复多次的连接释放了
为啥要有连接池
解决反复用jdbc连接数据库造成的资源浪费
怎么建立连接池
以下面两个例子展示
c3p0
导入jar
| 下载地址:下载地址
配置文件
| 在src下新建文件(file)c3p0-config.xml 复制下面代码改下数据源:
<c3p0-config>
<!--使用默认配置读取连接池对象-->
<default-config>
<!--连接参数 需要改成自己的参数-->
<property name="driverClass" >com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl" >jdbc:mysql://localhost:3306/oldproject?serverTimezone=GMT</property>
<property name="user" >root</property>
<property name="password" >123456</property>
<!--连接池参数-->
<property name="initialPoolSize">5</property><!--初始化数量-->
<property name="maxPoolSize">10</property><!--最大数量-->
<property name="checkoutTimeout">3000</property><!--超时时间-->
</default-config>
<!--自己命名的连接-->
<name-config name="otherc3p0">
<!--连接参数-->
<property name="driverClass" >com.mysql.cj.jdbc.Driver</property>
<property name="jdbcurl" >jdbc:mysql://localhost:3306/zzydb</property>
<property name="user" >root</property>
<property name="password" >123456</property>
<!--连接池参数-->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</name-config>
</c3p0-config>
测试连接
| 代码:
public class C3p0Demo1 {
public static void main(String[] args) throws SQLException {
/**
* 创建数据库连接池对象
*/
DataSource ds = new ComboPooledDataSource();
/**
* 获取连接
*/
Connection conn = ds.getConnection();
/**
*打印连接
*/
System.out.println(conn);
}
}
控制台输出
红色是日志信息不是报错,最后一串就是打印出来的连接,到这就已经连接上了,具体的数据操作和jdbc基本一致。
Druid
导入jar包
| 下载地址:下载地址
配置文件
| 新建druid.properties文件如下:我这里用了8版本mysql,注意时区,和c3p0配置文件基本一致
url=jdbc:mysql://localhost:3306/oldproject?serverTimezone=GMT
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=123456
##初始连接数,默认0
initialSize=5
#最大连接数,默认8
maxActive=10
#最小闲置数
minIdle=10
#获取连接的最大等待时间,单位毫秒
maxWait=2000
#缓存PreparedStatement,默认false
poolPreparedStatements=true
#缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句设置
maxOpenPreparedStatements=20
测试连接
| 代码:因为不是必须要求在src下,需要自己手动使用类加载器加载,学反射案例也用到这个
public class DruidDemo {
public static void main(String[] args) throws Exception {
/**
* 加载配置文件
*/
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
Properties pro = new Properties();
pro.load(is);
/**
* 获取连接池对象
*/
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
/**
* 获取连接,连接次数为11次,超过配置中最大数量
*/
for (int i = 0; i < 11; i++) {
Connection conn = ds.getConnection();
System.out.println(i+": "+conn);
}
}
}
控制台输出
因为配置文件中设置最大连接数量为10,而我新建11个,所以会报错,而且是前10个没问题(0-9),在生成第十一个时候,超时2秒后报错。
使用连接必须归还,close()方法在这里不再是关闭连接,而是放回连接池中!