`

tomcat连接池的三个重要参数

阅读更多
a.   如果设为true则tomcat自动检查恢复重新利用,没有正常关闭的Connection.(默认是false)
  <parameter>
  <name>removeAbandoned</name>
  <value>true</value>
  </parameter>
b.   设定连接在多少秒内被认为是放弃的连接,即可进行恢复利用。
  <parameter>
  <name>removeAbandonedTimeout</name>
  <value>60</value>
  </parameter>
c.   输出回收的日志,可以详细打印出异常从而发现是在那里发生了泄漏
  <parameter>
  <name>logAbandoned</name>
  <value>true</value>
  </parameter>

实验环境,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]SQLError: 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.<init>(AbandonedTrace.java:79)
        at org.apache.commons.dbcp.DelegatingResultSet.<init>(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性能造成什么影响,应该不大。

分享到:
评论

相关推荐

    基于Tomcat的数据库连接池配置和测试 的三种方法

    数据连接池的工作机制:J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就...

    TOMCAT配置数据源连接池

    driverClassName:驱动 url:指定连接字符串 ... maxActive:连接池可以存储的最大连接数 maxIdle:最大空闲连接数 maxWait:暂时无法获得数据库连接的... 可根据应用程序的用户访问情况对这三个参数进行调整。

    Apache Tomcat JBOSS Nginx区别

    Jetty 能够提供数据库连接池服务,不仅支持 JSP 等 Java 技术,同时还支持其他 Web 技术的集成,譬如 PHP、.NET 两大阵营。Jetty 的性能参数匹配甚至超越了本地 Apache HTTP 服务器或者 IIS。 三、Nginx Nginx 是...

    润乾报表与dthealth部署

    三、数据源连接池配置 在数据源连接池配置中,需要在context.xml文件中添加数据源配置信息,包括资源名称、驱动程序类名、URL、用户名、密码等信息。 四、War包部署 在War包部署中,需要将runqianReport文件放在...

    java面试题web部分

    Servlet的生命周期分为三个阶段:加载、服务、销毁。web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do*()方法。结束...

    心理咨询预约管理系统(javaEE)-毕业设计.zip

    分为三个端:管理员、来访者(需要预约的人),咨询师 管理员端 首页 系统近况(咨询师和注册来访者数量,预约数量) 显示最新的消息、留言和公告(最新十条) 主要功能 咨询师管理(添加、修改、删除,账号激活...

    java面试题

    76.4. 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 86 76.5. 在weblogic中发布ejb需涉及到哪些配置文件 87 76.6. 如何在weblogic中...

    地址栏重写

    一般来说,要显示一些...当时曾经做过一个J2EE的网站放在虚拟主机上要对Tomcat做配置才能启用数据库连接池,但是虚拟主机提供商不提供这种服务),其实在ASP.NET中可以通过自定义IHttpModule就可以实现URL地址重写。

    java开源包4

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包1

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包11

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包2

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包3

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包6

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包5

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包10

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包8

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包7

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包9

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包101

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

Global site tag (gtag.js) - Google Analytics