服务器

位置:IT落伍者 >> 服务器 >> 浏览文章

tomcat连接池的三个重要参数[2]


发布日期:2024年01月23日
 
tomcat连接池的三个重要参数[2]

使用如下代码进行实验(每一次不关闭连接)

try {

Connection con = getJdbcDAO()getDataSource()getConnection();

ResultSet rs = concreateStatement()executeQuery(select * from K_MSB_MSPBXX);

while (rsnext()) {

Systemoutprintln(rsgetString());

}

} catch (SQLException e) {

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 根据如下脚本查数据库连接

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性能造成什么影响应该不大

[] []

               

上一篇:tomcat配置技巧

下一篇:tomcat连接池的三个重要参数[1]