没有足够的Tomcat中JDBC池空闲连接(There are not enough idle co

2019-08-18 11:13发布

考虑下面的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

Answer 1:

我不是MySQL的专家,但使用的是Tomcat JDBC与Oracle一会儿。 空闲连接,只要应用程序没有关闭坚持在这里。 我会检查connecion日志在MySQL和启用日志记录在Tomcat的JDBC,看看谁是真正关闭连接。 无论是人做。



Answer 2:

我不知道这是不是你的问题的原因,但是当我使用MySQL JDBC库,我一直有一个问题,如果一个连接被打开了很长时间(1小时以上),它随机产生一个破碎当我再次使用它管。

也许池不重新建立这样的错误之后的连接(错误与testWhileIdle?)你可以尝试设置removeAbandonedremoveAbandonedTimeout ,具有的价值,比方说30分钟? 我知道这是一个长镜头。



Answer 3:

这是与MySQL的问题。 正如@Djebel说尝试清理未使用的连接。 有一个问题,它启动,如果你重新启动mysql服务时,你得到这个错误的工作? 还要确保所有连接都处在关闭,而关闭服务器。 您可以使用shutdownHook,如果Tomcat没有为你做。



Answer 4:

我改变配置,情况似乎在提升,也有连接池现在总是超过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" />


文章来源: There are not enough idle connections in Tomcat JDBC pool