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 位
  • 开放JDK 7
  • 雄猫 7
  • MySQL 5.5
4

4 回答 4

0

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

也许在出现这样的错误后池没有重新建立连接(testWhileIdle 的错误?)你可以尝试设置removeAbandonedand removeAbandonedTimeout,比如 30 分钟的值吗?我知道这是一个长镜头。

于 2013-04-01T11:44:27.200 回答
0

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

于 2013-04-01T10:46:40.327 回答
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" />
于 2013-04-04T00:46:50.837 回答
0

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

于 2013-04-01T12:56:25.440 回答