我使用的是MYSQL 5.0和Tomcat 5.5。 8小时后,MYSQL默认关闭所有空闲连接,所以我得到一个SQL异常。解决这个问题
答案 0 :(得分:6)
您使用的是哪个连接池?大多数允许定期执行心跳命令以防止连接空闲。
编辑:看DBCP configuration page,我认为你应该设置一个合适的(便宜的)validationQuery
。然后,您可以告诉DBCP在可能驱逐空闲连接(testWhileIdle
)时对其进行测试,或者在返回连接(testOnBorrow
)之前告诉它进行测试。第一个(希望!)保持你的空闲连接活着;第二个不会,但不会返回断开的连接(即如果有必要会创建一个新连接)。
答案 1 :(得分:2)
你的意思是你在空闲时保持连接活着吗?我不是mySql的专家,但在数据库中我一直在使用它被认为是良好的做法,只在需要时保持连接打开,然后关闭它。
答案 2 :(得分:1)
我不知道如何增加超时但我想应该有一个设置..为什么不在需要时创建连接,并在使用它之后关闭它而不是依赖于创建的连接?
答案 3 :(得分:1)
对于MySQL,默认情况下,一个打开的连接(通常在连接池中等待)将在8小时不活动后关闭。您可以通过在my.cnf或我们的mysql命令行中配置wait_timeout变量,将此时间从8小时更改
请参阅: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeout http://dev.mysql.com/doc/refman/5.0/en/gone-away.html
答案 4 :(得分:0)
几年前这个问题已被提出,但我觉得得到正确的答案是件好事。我有同样的问题,解决我不得不玩配置一点点。这对我有用。继续https://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html了解更多信息。下面的代码处理了一切。有办法优化价值观,但我会稍后处理这些。
<Resource name="jdbc/database"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="username" password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql:///"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"`enter code here`
timeBetweenEvictionRunsMillis="30000"
minIdle="10" `enter code here`
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
/>