使用如下代码进行实验(每一次不关闭连接)
try {
Connection con = getJdbcDAO()getDataSource()getConnection();
ResultSet rs = concreateStatement()executeQuery(select * from K_MSB_MSPBXX);
while (rsnext()) {
Systemoutprintln(rsgetString());
}
} catch (SQLException e) {
eprintStackTrace();
}
当该连续执行次之后后台就报连接池满的错
:
:
[org
hibernate
util
JDBCExceptionReporter]
[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 根据如下脚本查数据库连接
declare cur_spid cursor
for
select spid from sysprocesses where ipaddr= and program_name <> SQL_Advantage
go
declare @spid Integer
open cur_spid
fetch cur_spid into @spid
while @@sqlstatus=
begin
print %! @spid
dbcc traceon()
dbcc sqltext(@spid )
fetch cur_spid into @spid
end
close cur_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 orgapachecommonsdbcpAbandonedTraceinit(AbandonedTracejava:)
at orgapachecommonsdbcpAbandonedTrace<init>(AbandonedTracejava:)
at orgapachecommonsdbcpDelegatingResultSet<init>(DelegatingResultSetjava:)
at orgapachecommonsdbcpDelegatingResultSetwrapResultSet(DelegatingResultSetjava:)
at orgapachecommonsdbcpDelegatingStatementexecuteQuery(DelegatingStatementjava:)
at comthunisoftfyspxtSpxtBaseLogiccreatePbxx(SpxtBaseLogicjava:)
如果时间超过removeAbandonedTimeout设置的时间再直接使用上面的sql脚本查看数据库连接发现已经都被释放了并且如果再进行其他数据库操作已经不报连接池满的问题说明过了秒之后tomcat会把那些它认为没有释放的连接进行释放
然后同样的java代码把tomcat连接池的那三个参数去掉之后执行次之后也报连接池满但是再次执行就不能获取新的连接并且后台的日志都是连接池满的信息而没有具体那一行代码的连接没有释放的异常信息
因为大兴实际环境还是出现连接池满的问题(基本上两天报一次)准备把这三个参数放到实际环境中试试然后看看后台日志一是想得到具体是哪些地方的代码没有释放二是如果设置removeAbandonedTimeout参数可以避免连接没有释放的问题当然个人认为三期代码的最终部署环境是不需要该参数的在程序中把连接释放才是解决问题的最根本办法另外目前还不知道这三个参数会对tomcat性能造成什么影响应该不大
[] []