mysql数据库连接不释放问题
1 数据库连接无法释放原帖内容
1.1 原帖内容
原帖:http://eip.teamshub.comt3668709 服务封装平台集成jcf框架后数据库连接无法释放。
服务封装平台集成jcf框架后数据库连接无法释放。
服务注册->批量数据服务问题描述:
连续加载该功能点后,后台无法执行dao层的服务。
问题原因:
经排查造成该问题的原因是:有个别的ajax调用数据库连接无法释放造成的。在批量数据服务功能点中初始加载方法中会有4个ajax查询服务,其中有一个连接可以释放,其它的服务都不能释放。
解决方法:
1.增加连接数:
xxx-web/resources/application.properties中增加
jcf.datasource.A.initial-size=10
jcf.datasource.A.min-idle=10
jcf.datasource.A.max-active=100
jcf.datasource.A.max-wait=60000
2.查找有哪些服务是可以释放连接,哪些服务是不可以释放的。找出差别。
数据库连接的查看方法:
xxx-web的pom.xml中增加
com.xxx.ijcf
ijcf-boot-starter-actuator
xxx-dao的pom.xml中增加
org.apache.commons
commons-dbcp2
2.1.1
xml不能贴上来,请看附件。project_pom.xml
将project-web/resources/application.properties中jcf.datasource.A.type修改为:
jcf.datasource.A.type=org.apache.commons.dbcp2.BasicDataSource
浏览器访问:http://localhost:23000/open/datasource
按照原帖修改后效果:
页面仍旧存在数据库连接无法释放,且页面较之前存在卡顿现象,访问页面时,后台连接数据时间超长。
2 数据库连接释放问题解决 (暂未完全解决,只是延缓)
2.1 恢复dbcp连接方式
在通过程序跟踪代码,project-web-exec.jar
实际打包后同时存在着两个jar包
project-web-exec.jar\lib\commons-dbcp2-2.1.1.jar
project-web-exec.jar\lib\commons-dbcp-1.4.jar
但底层类com.xxx.dss.hibernate.dao.impl.BaseDao仍旧使用的是 commons-dbcp-1.4.jar包,仍旧使用的org.apache.commons.dbcp.BasicDataSource连接;
/project-web/src/main/resources/application.properties
把连接池信息修改为dbcp连接后,页面上卡顿现象消失,页面访问能够快速响应并返回查询内容;
#jcf.datasource.A.type=org.apache.commons.dbcp2.BasicDataSource
jcf.datasource.A.type=org.apache.commons.dbcp.BasicDataSource
2.2 底层代码升级使用后hibernate5连接类
核对hibernate使用版本为hibernate-core-5.0.12.Final.jar核心包
之前采用框架采用hibernate-core-4.1.8.Final.jar
底层代码相关类由hibernate4升级使用后hibernate5:
org.springframework.orm.hibernate5.SessionFactoryUtils
org.springframework.orm.hibernate5.support.HibernateDaoSupport
org.springframework.orm.hibernate5.HibernateCallback
org.springframework.orm.hibernate5.HibernateTemplate
org.springframework.orm.hibernate5.support.HibernateDaoSupport
2.3 获取连接池session部分代码修改
修改前:
Query query = super.getSessionFactory().getCurrentSession().createSQLQuery(sql);
修改后:
Query query = super.getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(sql);
3 数据库连接释放问题解决 (在2.1基础上修改,完全解决)
3.1 修改数据库连接方式(采用HikariCP连接)
资源文件路径:/project-web/src/main/resources/application.properties
jcf.datasource.A.type=com.zaxxer.hikari.HikariDataSource
jcf.datasource.A.default-auto-commit=true
jcf.datasource.A.initial-size=5
jcf.datasource.A.minimum-idle=5
jcf.datasource.A.maximum-pool-size=20
jcf.datasource.A.auto-commit=true
jcf.datasource.A.idle-timeout=30000
jcf.datasource.A.pool-name=DatebookHikariCP
jcf.datasource.A.max-lifetime=1800000
jcf.datasource.A.connection-timeout=30000
jcf.datasource.A.connection-test-query=SELECT 1
3.2 连接池监控
http://127.0.0.1:23000/bdsOpen/datasource
[{"url":"jdbc:mysql://172.21.xx.xx:3307/db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false","username":"user","password":"b***s","type":"com.zaxxer.hikari.HikariDataSource","driverClassName":"com.mysql.jdbc.Driver","defaultAutoCommit":true,"maxWaitMillis":30000,"maxEvictableIdleTimeMillis":30000,"maxConnLifetimeMillis":1800000,"validationQuery":"SELECT 1","minIdle":5,"maxTotal":20,"registerMbeans":false,"allowPoolSuspension":false,"numActive":0,"idleNum":14,"numOfAll":14,"numThreadWait":0}]
活跃连接数[numActive]:在没有查询的情况下,要回归到0,才算正常;