`

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连接池配置

    三、配置Tomcat连接池 以C3P0为例,配置步骤如下: 1. 添加依赖:在`WEB-INF/lib`目录下添加C3P0的jar包,如`c3p0-0.9.5.5.jar`和`mchange-commons-java-0.2.22.jar`。 2. 配置数据源:在`conf/context.xml`中添加...

    Tomcat连接池的配置

    总结来说,配置Tomcat连接池是提升Web应用数据库访问性能的重要步骤。通过合理配置连接池参数,可以有效管理数据库连接,避免资源浪费,提升系统整体性能。同时,持续监控和优化连接池设置是保持系统高效运行的关键...

    tomcat 连接池的配置笔记以及测试源码

    本文将深入探讨Tomcat连接池的配置,包括全局与局部配置的区别,以及可能出现的错误类型,并提供相关的测试源码。 一、Tomcat连接池介绍 Tomcat内建了两种连接池实现:Apache Commons DBCP(Database Connection ...

    Tomcat6配置连接池

    ### Tomcat6配置连接池详解 #### 一、引言 在Java Web开发中,数据库连接池技术的应用极为广泛。合理的数据库连接管理不仅能提高应用程序的性能,还能有效避免因频繁创建销毁连接所导致的资源浪费问题。Apache ...

    Tomcat配置连接池说明

    ### 二、Tomcat连接池配置详解 #### 1. 修改server.xml文件 Tomcat的server.xml文件位于conf目录下,是Tomcat的核心配置文件,控制着Tomcat的启动、停止以及主要服务的配置。在该文件中,我们可以通过添加`...

    Tomcat6连接池配置详解(自动重连)

    在Tomcat6中配置连接池的第一步是修改`conf/server.xml`文件,增加一个`&lt;Resource&gt;`节点来定义连接池。以下是配置示例: ```xml name="jndi_test" auth="Container" type="javax.sql.DataSource" ...

    tomcat6.0连接池配置方法详解

    在Tomcat 6.0中配置连接池主要涉及两个文件:`context.xml` 和 `web.xml`。 ##### 1. 修改`context.xml` `context.xml` 文件位于 `$CATALINA_HOME/conf` 目录下,其中包含了关于全局上下文的信息,包括数据源等...

    TOMCAT连接池

    本文将详细介绍Tomcat连接池的配置过程及关键参数设置。 一、连接池的作用 连接池的主要目的是减少创建和销毁数据库连接的开销。在高并发场景下,频繁地建立和关闭连接会消耗大量时间和系统资源。通过预先创建一定...

    tomcat连接池配置.doc

    正确配置Tomcat连接池对于提高Web应用程序的性能至关重要。通过对连接池的合理配置,不仅可以减少数据库连接的创建和销毁操作,还能有效地管理数据库连接资源,从而提高系统的响应速度和稳定性。希望本文提供的配置...

    Tomcat连接池配置四步走

    ### Tomcat连接池配置详解 #### 一、引言 在现代Web应用开发中,数据库连接池技术的应用极为广泛。...以上就是关于“Tomcat连接池配置四步走”的详细介绍,希望能帮助开发者们更好地理解和掌握这一重要技术。

    Tomcat连接池配置

    ### Tomcat连接池配置的重要性 在Web应用中,数据库操作是常见的业务需求之一,而数据库连接的创建与释放则是一个耗时的过程。为了解决这一问题,提高应用程序的效率,引入了数据库连接池的概念。连接池可以预先...

    tomcat连接池mysql多种配置

    2. 创建配置文件:在Tomcat的conf目录下创建c3p0.properties文件,设置连接池的相关参数,如初始连接数、最大连接数等。 3. 配置数据源:在web.xml中配置C3P0的数据源,包括数据库驱动、URL、用户名和密码等。 二、...

    Tomcat连接池配置详解

    **Tomcat连接池配置详解** 在Java Web应用中,数据库连接池是不可或缺的一部分,它能够有效地管理和重用数据库连接,提高应用性能并降低系统资源消耗。Tomcat作为一款流行的Servlet容器,内置了多种连接池实现,如...

    tomcat6连接池 数据源配置

    在Tomcat 6中配置连接池数据源主要涉及两个配置文件:`context.xml` 和 `web.xml`。 - **`context.xml`**:位于 `$CATALINA_HOME/conf/Catalina/localhost/` 目录下,用于定义特定上下文的数据源和其他资源。 - **`...

Global site tag (gtag.js) - Google Analytics