Tomcat 池不重置池。获得太多连接错误

Posted

技术标签:

【中文标题】Tomcat 池不重置池。获得太多连接错误【英文标题】:tomcat pool not resetting the pool. Getting too many connections error 【发布时间】:2012-05-30 03:51:25 【问题描述】:

我在 tomcat 6 上使用 tomcat pool。以下是我的资源定义:

 <Resource name="jdbc/DBConnectionFactory"
            auth="Container"
            type="javax.sql.DataSource"
            username="root"
         password="root"
        removeAbandoned="true"
        removeAbandonedTimeout="600"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost/sicad?autoReconnect=true"
               minIdle="3"
       maxActive="250"
       testWhileIdle="true"
       validationQuery="SELECT 1"
            maxIdle="10"
           timeBetweenEvictionRunsMillis="10000"
           minEvictableIdleTimeMillis="10000"
              maxWait="-1"
     />

现在,理想情况下,在达到 250 个连接后,应该删除所有空闲连接,或者至少通过某种方式 mysql 不应该给出太多连接错误。另外,请注意,如果我执行 showprocesslist,则几乎没有任何并发​​查询正在进行。所以我在想 timeBetweenEvictionRunsMillis 应该做删除空闲连接并保持池活动的技巧。但是一旦设置了 250 个连接,mysql 就会开始抛出太多连接错误。我期望 tomcat 池会从池中删除任何空闲连接,以保持池大小合理。另请注意,并不是要创建这么多。

更糟糕的是,同样的配置在开发机器和登台服务器 + 测试服务器上运行,但在产品服务器上却不行。所有机器也是彼此的克隆。我已经重启了机器,重新安装了 mysql,但一切都是徒劳的。

【问题讨论】:

在与从DataSource 获得连接的位置完全相同的try 块的finally 块中使用后,您是否关闭连接? 【参考方案1】:

是否在全局或应用程序级别进行了配置?查看 Mark Thomas 的 4 Mistakes To Avoid On Apache Tomcat,了解将 context.xml 放在错误的位置如何创建比您预期更多的连接。长话短说:

如果您在全局 context.xml 中配置池,您将获得每个应用程序的池 如果您在应用程序context.xml 中配置池,您只会得到一个池 如果你想在应用程序之间共享一个全局池,你必须使用resource links

【讨论】:

这应该不是问题,因为我只有一个使用 DB 的网络应用程序。【参考方案2】:

什么都没有,最后放弃硬件和相同的代码库,驱动程序和mysql安装工作。

【讨论】:

以上是关于Tomcat 池不重置池。获得太多连接错误的主要内容,如果未能解决你的问题,请参考以下文章

Jboss连接池不与DataBase连接

性能测试:连接池不释放

Tomcat JDBC连接池:testOnBorrow vs testWhileIdle

Hibernate:啥是连接池,为啥默认的连接池不适合生产?

Tomcat 连接池创建太多连接,卡在睡眠模式

nginx tomcat7 错误:-“从上游读取响应标头时,recv() 失败(104:对等连接重置)”