tomcat连接池的三个重要参数

引用:
a.   如果设为true则tomcat自动检查恢复重新利用,没有正常关闭的Connection.(默认是false)
  
  removeAbandoned
  true
  
b.   设定连接在多少秒内被认为是放弃的连接,即可进行恢复利用。
  
  removeAbandonedTimeout
  60
  
c.   输出回收的 日志,可以详细打印出异常从而发现是在那里发生了泄漏
  
  logAbandoned
  true
  
实验 环境,tomcat配置连接池,最大连接数为5.
代码如下:
 
< parameter >
                
< name > maxActive name >
                
< value > 5 value >              
            
parameter >
            
< parameter >
                
< name > maxIdle name >
                
< value > 1 value >               
            
parameter >
            
< parameter >
                
< name > maxWait name >
                
< value > 20000 value >           
            
parameter >
            
< parameter >
                
< name > removeAbandoned name >
                
< value > true value >
            
parameter >
            
< parameter >
                 
< name > removeAbandonedTimeout name >
                 
< value > 60 value >
            
parameter >
            
< parameter >
                 
< name > logAbandoned name >
                 
< value > true value >
            
parameter >
使用如下代码进行实验(每一次不关闭连接):
try  {
    Connection con 
=  getJdbcDAO().getDataSource().getConnection();
    ResultSet rs 
=  con.createStatement().executeQuery( " select * from K_MS..B_MSPBXX " );
    
while  (rs.next()) {
        System.out.println(rs.getString(
1 ));
    }
catch  (SQLException e) {
     e.printStackTrace();
}

当该连续执行5次之后,后台就报连接池满的错:
2008-09-06 14:31:02,471 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 0, SQLState: null
2008-09-06 14:31:02,471 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] Cannot get a connection, pool exhausted
2008-09-06 14:31:02,580 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 0, SQLState: null
2008-09-06 14:31:02,580 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] Cannot get a connection, pool exhausted
根据如下脚本查 数据连接
declare  cur_spid  cursor  
for
select  spid  from  sysprocesses  where  ipaddr = ' 172.16.16.145 '   and  program_name  <>   ' SQL_Advantage '
go
declare   @spid   Integer
open   cur_spid
fetch  cur_spid  into   @spid  
while   @@sqlstatus = 0
begin
        
print   ' %1! '  ,  @spid
  
dbcc  traceon( 3604 )
  
dbcc  sqltext( @spid  )
  
fetch  cur_spid  into   @spid  
end
close  cur_spid
 
得到类似如下的五条记录,即有5个连接没有释放
引用:
95
DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
SQL Text: select * from K_MS..B_MSPBXX
DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
如果继续执行该代码,后台就报如下错,提示哪里的代码没有关闭连接(已经具体到那一行代码获取的连接没有关闭,这个很重要!!!下面红颜色标注的异常点信息就是具体连接没有释放的代码信息)
 
DBCP object created 2008-09-06 14:27:32 by the following code was never closed:
java.lang.Exception
        at org.apache.commons.dbcp.AbandonedTrace.init(AbandonedTrace.java:96)
        at org.apache.commons.dbcp.AbandonedTrace.(AbandonedTrace.java:79)
        at org.apache.commons.dbcp.DelegatingResultSet.(DelegatingResultSet.java:71)
        at org.apache.commons.dbcp.DelegatingResultSet.wrapResultSet(DelegatingResultSet.java:80)
        at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:205)
         at com.thunisoft.fy.spxt.SpxtBaseLogic.createPbxx(SpxtBaseLogic.java:5772)
如果时间超过removeAbandonedTimeout设置的时间,再直接使用上面的sql脚本查看数据库连接发现已经都被释放了,并且如果再进行其他数据库操作已经不报连接池满的 问题。说明过了60秒之后,tomcat会把那些它认为没有释放的连接进行释放。

    然后同样的java代码,把tomcat连接池的那三个 参数去掉之后,执行5次之后也报连接池满,但是再次执行就不能获取新的连接,并且后台的日志都是连接池满的信息,而没有具体那一行代码的连接没有释放的异常信息。

    因为大兴实际环境还是出现连接池满的问题(基本上两天报一次),准备把这三个参数放到实际环境中试试然后看看后台日志,一是想得到具体是哪些地方的代码没有释放,二是如果设置removeAbandonedTimeout参数,可以避免连接没有释放的问题。当然个人认为三期代码的最终部署环境是不需要该参数的,在程序中把连接释放才是解决问题的最根本办法,另外目前还不知道这三个参数会对tomcat性能造成什么影响,应该不大。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14734416/viewspace-442251/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14734416/viewspace-442251/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值