DBCP1.3连接泄露问题
来源:互联网 发布:3d打印 软件 编辑:程序博客网 时间:2024/06/05 13:30
线上使用的dbcp版本1.3
,数据库为达梦7。
问题
在生产环境下发现,dbcp所连接的库一旦因为其它原因挂掉,再次重启数据库后会话将直接撑爆数据库
,接着导致数据库再次挂掉。
如图中所示,会话撑满100个(上限默认的为100),连接全部是IDLE。
在参考issue DBCP-470后经本地测试发现问题重现。
问题主要原因是当所连接的数据库停机后,此时通过程序创建BasicDataSource对象来访问数据库时validateConnectionFactory方法抛异常导致datasource成员变量一直为空。
主要问题在于createDataSource()
方法。
通过
dataSource !=null
来防止重复创建数据源创建连接池
问题在于createPoolableConnectionFactory
方法里会调用validateConnectionFactory
方法来校验目的库是否可连接。如果不可连接将抛出异常,这将导致createDataSourceInstance()
不会走,也就不会实例化dataSource变量。
连接泄露
上面由于在异常时没有实例化dataSource变量,当重复调用createDataSource()
方法时,将导致createConnectionPool()
方法会重复调用。GC无法回收
在createConnectionPool()
方法中,调用GenericObjectPool
的setTimeBetweenEvictionRunsMillis()
方法时会开启一个Timer。这将导致GenericObjectPool对象由于被Timer对象引用而一直无法被回收掉。
- jmap生成dump文件分析
线上数据库确实如图中所示有那么多连接数被占用。
解决问题
在dbcp-470问题中提到解决版本为1.4.1
但是官网并没有release 1.4.1版本。
随便通过在GIT上找到commons-dbcp源码,在其1.4版本的分支中发现问题已经解决。
此处已经try-catch
了,并有在finally
块中关闭了上面创建的连接池。
此时下载该版本的源代码编译打包后,再经测试发现问题已经解决了。
编译后的jar包下载地址
- DBCP1.3连接泄露问题
- DBCP1.3连接泄露问题
- DBCP1.3连接泄露问题
- DBCP1.3连接泄露问题
- DBCP1.3连接泄露问题
- DBCP1.3连接泄露问题
- DBCP1.3连接泄露问题
- DBCP1.3连接泄露问题
- DBCP1.3数据库连接泄漏问题
- 数据库消除连接泄露问题
- DBCP连接池泄露问题
- openssl DTLS连接内存泄露问题
- HibernateDaoSupport 类session未关闭导致的连接泄露问题
- activemq 5.6 连接池的内存泄露问题
- 关于使用dbcp1.4出现的No suitable driver异常的问题!
- 使用druid连接池的超时回收机制排查连接泄露问题
- 使用druid连接池的超时回收机制排查连接泄露问题
- 使用druid连接池的超时回收机制排查连接泄露问题
- ffmpeg 之 时间戳
- Appium+Python移动端自动化案例一个
- 实用故障例子
- LeetCode Keyboard Row
- python 配置文件(json文件)
- DBCP1.3连接泄露问题
- 【java开发部署】利用svn及ocaml及unison进行javaweb网站部署
- 2017.3.20 MATLAB(一)数据类型
- 如何创建一个Mavlink Message(一)
- MFC中CArray<CString,CString>m_FileItem是什么意思
- Mysql SELECT语句之limit参数
- Android 调用系统相机拍照(适配7.0)、从图库选择图片;从数据库读取联系人信息、相册图片
- Intel RealSense(实感技术)概览
- jquery图片提示效果