借助此博客的帮助:
https://blog.csdn.net/Another_dream/article/details/88699056
配置了一波c3p0连接池,效果还是不错的
使用的配置都是和博主配置一样
代码更新
我原本是将一个数据库连接操作(从登录数据库到做好业务逻辑再到关闭过程)封装成一个类的,因此我只要将这个类的构造方法改为从连接池里面拿一个连接出来就行。
并在数据库操作做完后归还这个连接
Connection conn = null;
Statement stmt = null;
public MySQLConnect(){
try{
conn = C3P0Util.getConnection();
stmt = conn.createStatement();
/**
// 注册 JDBC 驱动
Class.forName(JDBC_DRIVER);
// 打开链接
conn = DriverManager.getConnection(DB_URL,USER,PASS);
//打开Statement
stmt = conn.createStatement();
*/
} catch(Exception se){
// 处理 JDBC 错误
se.printStackTrace();
}
}
@Override
protected void finalize() throws SQLException {
// 析构方法
if(stmt!=null) {
stmt.close();
}
C3P0Util.beginTransaction();
C3P0Util.commitTransaction();
C3P0Util.releaseConnection(conn);
}
······//各种被封装起来的数据库交互逻辑
}
下面记录一些配置与使用过程中发现的问题:
导包
c3p0总共要导3个包mchange-commons-java-0.2.20,c3p0-0.9.2.1,mysql-connector-java-8.0.16
少导一个都不行,当然第三个不用c3p0也要导…
链接:https://pan.baidu.com/s/1JxsHPuL2PqLW0sS0RABmJg
提取码:hqk3
同时版本问题注意一下,我的是8.0的数据库
顺便一提c3p0-config.xml文件在Idea中放进一个标记为资源根(Resources Root)的文件夹中即可。
它最终会被放进编译后的文件的默认classpath中:
测试
但是测试的时候对页面进行疯狂刷新,很快就会连接请求时长爆表
报错为:c3p0 A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool
推测原因应该是短时间内重复获取连接池连接,而没有等待正常业务逻辑完成后返回请求归还连接池资源的原因
当然猜测而已,反正造成的后果就是连接池泄露崩溃了。
解决方案:
提高最大连接数是可以缓解的,但应该不是最终方案
stack上有大佬指出设置一个参数用来自动对泄露的连接池资源进行归还管理
https://stackoverflow.com/questions/43630264/c3p0-a-client-timed-out-while-waiting-to-acquire-a-resource-from-com-mchange-v2
<property name="unreturnedConnectionTimeout">20</property>
然后我随便怎么乱刷就都没有爆炸了。