Tomcat JDBC池中没有足够的空闲连接

时间:2013-03-31 22:42:59

标签: java mysql tomcat jdbc

给出以下Tomcat JDBC连接设置:

<Resource name="jdbc/pc4"
            maxActive="200"
            maxIdle="100"
            minIdle="50"
            initialSize="50"
            maxWait="15000"
            auth="Container"
            type="javax.sql.DataSource"
            username="....."
            password="....."
            testOnBorrow="true"
            testWhileIdle="true"
            validationQuery="select 1"
            driverClassName="com.mysql.jdbc.Driver"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            url="jdbc:mysql://server_address/db_name?autoReconnect=true&amp;autoReconnectForPools=true&amp;zeroDateTimeBehavior=convertToNull&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;socketTimeout=300000" />

遵循MySQL参数:

max_connections = 100000
wait_timeout = 31536000
interactive_timeout = 31536000

我希望连接池中始终至少有50个空闲连接。

但真正发生的事情是:服务器启动时有50个连接,一段时间后,所有连接都会死掉,除了最后一个连接。

我的配置有错吗?

环境:

  • Linux 3.4 64位
  • OpenJDK 7
  • Tomcat 7
  • MySQL 5.5

4 个答案:

答案 0 :(得分:0)

我不是MySQL专家,但在一段时间内使用Tomcat JDBC和Oracle。只要应用程序未关闭,空闲连接就会一直存在。我会检查MySQL中的连接日志并启用Tomcat JDBC中的日志记录,以查看谁真正关闭了连接。任何一个都可以。

答案 1 :(得分:0)

我不知道这是否是导致问题的原因,但是当我使用MySQL JDBC库时,如果连接长时间打开(超过1小时),我总会遇到问题,当我再次使用它时,它会随机导致管道损坏。

在这样的错误之后,池可能没有重新建立连接(testWhileIdle的错误?)你可以尝试设置removeAbandonedremoveAbandonedTimeout,值为,let&#39;比如说,30分钟?我知道这是一个很长的镜头。

答案 2 :(得分:0)

这是mysql的一个问题。正如@Djebel所说,试着清理未使用的连接。 一个问题,如果你在收到此错误时重新启动mysql服务,它是否会开始工作?还要确保在关闭服务器时关闭所有连接。如果Tomcat没有为你做这件事,你可以使用shutdownHook。

答案 3 :(得分:0)

我更改了配置,情况似乎有所改善,现在连接池中总有超过25个连接(但仍然不确定为什么)。

 <Resource name="jdbc/pc4"
            maxActive="-1"
            maxIdle="-1"
            minIdle="20"
            initialSize="20"
            maxWait="-1"
            auth="Container"
            type="javax.sql.DataSource"
            username="__"
            password="__"
            driverClassName="com.mysql.jdbc.Driver"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            testOnBorrow="true"
            testWhileIdle="true"
            testOnReturn="true"
            timeBetweenEvictionRunsMillis="60000"
            minEvictableIdleTimeMillis="60000"
            removeAbandoned="false"
            validationQuery="SELECT 1;"
            url="jdbc:mysql://__/__?autoReconnect=true&amp;autoReconnectForPools=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull&amp;socketTimeout=72000000" />