【问题标题】:Spring Throws "ERROR SqlExceptionHelper: Already closed" after timeout超时后Spring抛出“错误SqlExceptionHelper:已经关闭”
【发布时间】:2020-03-14 13:20:47
【问题描述】:
我有一个托管在服务器上的 spring 应用程序 (Tomcat 8.5)。如果没有人使用它就会闲置。我已经知道如果数据库处于空闲状态 8 小时会发生超时(MySQL 的默认超时)。正如Spring Autoreconnect 和Connection lost overnight 帖子中提到的那样,我已经尝试了here 可用的解决方案。我已经尝试配置application.properties,但这并没有为问题带来任何解决方案。
(PS:除了我的 Spring 应用程序中的 application.properties 之外,我没有更改任何其他内容)。
【问题讨论】:
标签:
java
mysql
spring
hibernate
tomcat8
【解决方案1】:
如果这样的话
spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.validationQuery = SELECT 1
或者这个
spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1
没用的可以试试这个
帖子SpringBoot 1.4 名称已更改
他们为 spring 支持的四个连接池定义了新的特定命名空间:tomcat、hikari、dbcp、dbcp2。
spring.datasource.tomcat.testOnBorrow=true
spring.datasource.tomcat.validationQuery=SELECT 1
【解决方案2】:
如果在 application.properties 中包含属性后问题仍未解决,则在位于 src/main/resources 的 application-context.xml 中包含 testOnBorrow、validationQuery 时问题将得到解决
<bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${database.driver.classname}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
<property name="initialSize" value="2"/>
<property name="maxActive" value="50"/>
<property name="maxIdle" value="5"/>
<property name="maxWait" value="-1"/>
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="600"/>
<property name="logAbandoned" value="true"/>
<property name="testOnBorrow" value="true" />
<property name="validationQuery" value="SELECT 1" />
</bean>
解决方案是通过启用 testOnBorrow 并提供 validationQuery 来验证从线程池借用的连接线程>.