Tomcat JDBC池中空闲连接不足

4

考虑以下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-bit - OpenJDK 7 - Tomcat 7 - MySQL 5.5
4个回答

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" />

0

我不是MySQL专家,但已经使用Tomcat JDBC与Oracle一段时间了。只要应用程序没有关闭,空闲连接就会持续存在。我会检查MySQL中的连接日志,并在Tomcat JDBC中启用日志记录,以查看谁真正关闭了连接。两者都可能。


0

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

也许连接池在此类错误后没有重新建立连接(testWhileIdle存在错误?)你可以尝试设置removeAbandonedremoveAbandonedTimeout,值为30分钟左右。我知道这是一个冒险。


0

这是一个与mysql相关的问题。正如@Djebel所说,尝试清理未使用的连接。 有一个问题,如果您在出现此错误时重新启动mysql服务,它是否会开始工作?同时确保在关闭服务器时关闭所有连接。如果Tomcat没有为您执行此操作,您可以使用shutdownHook。


感谢您的输入。MySQL或Tomcat都没有错误,这只是在几分钟(有时几个小时)后自动发生的。 - user972946

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接