给出以下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&autoReconnectForPools=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&socketTimeout=300000" />
遵循MySQL参数:
max_connections = 100000
wait_timeout = 31536000
interactive_timeout = 31536000
我希望连接池中始终至少有50个空闲连接。
但真正发生的事情是:服务器启动时有50个连接,一段时间后,所有连接都会死掉,除了最后一个连接。
我的配置有错吗?
环境:
答案 0 :(得分:0)
我不是MySQL专家,但在一段时间内使用Tomcat JDBC和Oracle。只要应用程序未关闭,空闲连接就会一直存在。我会检查MySQL中的连接日志并启用Tomcat JDBC中的日志记录,以查看谁真正关闭了连接。任何一个都可以。
答案 1 :(得分:0)
我不知道这是否是导致问题的原因,但是当我使用MySQL JDBC库时,如果连接长时间打开(超过1小时),我总会遇到问题,当我再次使用它时,它会随机导致管道损坏。
在这样的错误之后,池可能没有重新建立连接(testWhileIdle的错误?)你可以尝试设置removeAbandoned
和removeAbandonedTimeout
,值为,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&autoReconnectForPools=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&socketTimeout=72000000" />