服务器

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

tomcat连接池的三个重要参数


发布日期:2020年07月26日
 
tomcat连接池的三个重要参数

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

上一篇:开源技术基础:TOMCAT的用法

下一篇:如何安装配置你的tomcat5并绑定域名