引用:
a 如果设为true则tomcat自动检查恢复重新利用没有正常关闭的Connection(默认是false)<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
b 设定连接在多少秒内被认为是放弃的连接即可进行恢复利用
<parameter>
<name>removeAbandonedTimeout</name>
<value></value>
</parameter>
c 输出回收的日志可以详细打印出异常从而发现是在那里发生了洩漏
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
实验环境
tomcat配置连接池
最大连接数为
代码如下
<parameter>
<name>maxActive</name>
<value></value>
</parameter>
<parameter>
<name>maxIdle</name>
<value></value>
</parameter>
<parameter>
<name>maxWait</name>
<value></value>
</parameter>
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>removeAbandonedTimeout</name>
<value></value>
</parameter>
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>使用如下代码进行实验(每一次不关闭连接)
try{
Connectioncon=getJdbcDAO()getDataSource()getConnection();
ResultSetrs=concreateStatement()executeQuery(select*fromK_MSB_MSPBXX);
while(rsnext()){
Systemoutprintln(rsgetString());
}
}catch(SQLExceptione){
eprintStackTrace();
}
当该连续执行次之后后台就报连接池满的错
:: [orghibernateutilJDBCExceptionReporter][WARN] SQL Error: SQLState: null
:: [orghibernateutilJDBCExceptionReporter][ERROR] Cannot get a connection pool exhausted
:: [orghibernateutilJDBCExceptionReporter][WARN] SQL Error: SQLState: null
:: [orghibernateutilJDBCExceptionReporter][ERROR] Cannot get a connection pool exhausted 根据如下脚本查数据库连接
declarecur_spidcursor
for
selectspidfromsysprocesseswhereipaddr=andprogram_name<>SQL_Advantage
go
declare@spidInteger
opencur_spid
fetchcur_spidinto@spid
while@@sqlstatus=
begin
print%!@spid
dbcctraceon()
dbccsqltext(@spid)
fetchcur_spidinto@spid
end
closecur_spid
得到类似如下的五条记录
即有
个连接没有释放
引用:
DBCC execution completed If DBCC printed error messages contact a user with System Administrator (SA) role
SQL Text: select * from K_MSB_MSPBXX
DBCC execution completed If DBCC printed error messages contact a user with System Administrator (SA) role
如果继续执行该代码
后台就报如下错
提示哪里的代码没有关闭连接(已经具体到那一行代码获取的连接没有关闭
这个很重要!!!下面红颜色标注的异常点信息就是具体连接没有释放的代码信息)
DBCP object created :: by the following code was never closed:javalangException
at monsdbcpAbandonedTraceinit(AbandonedTracejava:)
at monsdbcpAbandonedTrace<init>(AbandonedTracejava:)
at monsdbcpDelegatingResultSet<init>(DelegatingResultSetjava:)
at monsdbcpDelegatingResultSetwrapResultSet(DelegatingResultSetjava:)
at monsdbcpDelegatingStatementexecuteQuery(DelegatingStatementjava:)
at comthunisoftfyspxtSpxtBaseLogiccreatePbxx(SpxtBaseLogicjava:)
如果时间超过removeAbandonedTimeout设置的时间
再直接使用上面的sql脚本查看数据库连接发现已经都被释放了
并且如果再进行其他数据库操作已经不报连接池满的问题
说明过了
秒之后
tomcat会把那些它认为没有释放的连接进行释放
然后同样的java代码把tomcat连接池的那三个参数去掉之后执行次之后也报连接池满但是再次执行就不能获取新的连接并且后台的日志都是连接池满的信息而没有具体那一行代码的连接没有释放的异常信息
因为大兴实际环境还是出现连接池满的问题(基本上两天报一次)准备把这三个参数放到实际环境中试试然后看看后台日志一是想得到具体是哪些地方的代码没有释放二是如果设置removeAbandonedTimeout参数可以避免连接没有释放的问题当然个人认为三期代码的最终部署环境是不需要该参数的在程序中把连接释放才是解决问题的最根本办法另外目前还不知道这三个参数会对tomcat性能造成什么影响应该不大