首页 > 代码库 > DBCP object created 日期 by the following code was never closed:
DBCP object created 日期 by the following code was never closed:
1、分析
看到标题 DBCP 首先想到的肯定是 数据库连接池哪方面有问题,那么先别着急去解决,不要一股脑就钻进逻辑代码中,然后启用调试就开始一步一步
的分析。我们首先要做的就是想,想想数据库连接池,在项目中是如何实现的,那么不管你或早或晚,都会想到数据库连接池相关的配置文件和代码。那么
问题来了,是否是配置文件配置的有问题(挖掘技术哪家强?)?
那么先来分析下各项连接池配置的属性:
#回收被遗弃的(一般是忘了释放的)数据库连接到连接池中。
dataBase.removeAbandoned =false
# 数据库连接过多长时间不用将被视为被遗弃而收回连接池中。
dataBase.removeAbandonedTimeout = 30
# 将被遗弃的数据库连接的回收记入日志。
dataBase.logAbandoned = false
#连接池的最大数据库连接数,设为0 表示无限制。
dataBase.maxActive = 200
#数据库连接的最大空闲连接数。超过此空闲连接数,,数据库连接将被标记为不可用,然后被释放。设为0 表示无限制。
dataBase.maxIdle=40
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1 表示无限制
dataBase.maxWait=10000
#取得、返回对象和空闲时是否进行验证,检查对象是否有效,默认都为false即不验证
dataBase.testOnBorrow=true
dataBase.testWhileIdle=true
dataBase.testOnReturn=true
dataBase.validationQuery=select 1 from dual
说明:
1. #回收被遗弃的(一般是忘了释放的)数据库连接到连接池中。
dataBase.removeAbandoned =false
如果这个值为true一般是用来调试的时候用的,正式发布后应该改为false,2. # 将被遗弃的数据库连接的回收记入日志。
dataBase.logAbandoned = false
这个如果设置为true就会引起如下错误:
DBCP object created 日期 by the following code was never closed:
java.lang.Exception
3.#连接池的最大数据库连接数,设为0 表示无限制。
dataBase.maxActive = 200
#数据库连接的最大空闲时间。超过此空闲时间,数据库连接将被标记为不可用,然后被释放。设为0 表示无限制。
dataBase.maxIdle=40
会有可能出现:Cannot get a connection, pool error Timeout waiting for idle object这样的错误
(转载网上资料)
2、深入
不小心暴露的解决方法,那么 到底是为什么呢?
原因是:dataBase.removeAbandoned = true
设置为true以后,使用这个配置将会使用AbandonedObjectPool,同时上方也提到过,此配置只建议在开发阶段使用
因为,AbandonedObjectPool能帮你发现占用连接过长的代码,比如LOG信息,说明getCustomerOnline占用连接的时间
超过了removeAbandonedTimeout设定的时间,所以设置dataBase.removeAbandoned = false就行了,
AbandonedObjectPool只在开发使用,在后续的版本会去掉,并且现在的API都弃用(不赞成)了,因此在使用此
功能的时候多多注意。
DBCP object created 日期 by the following code was never closed: