【问题标题】:Spring Throws "ERROR SqlExceptionHelper: Already closed" after timeout超时后Spring抛出“错误SqlExceptionHelper:已经关闭”
【发布时间】:2020-03-14 13:20:47
【问题描述】:

我有一个托管在服务器上的 spring 应用程序 (Tomcat 8.5)。如果没有人使用它就会闲置。我已经知道如果数据库处于空闲状态 8 小时会发生超时(MySQL 的默认超时)。正如Spring AutoreconnectConnection 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 来验证从线程池借用的连接线程>.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 2019-04-07
        • 2014-12-05
        • 1970-01-01
        • 2013-08-12
        • 1970-01-01
        相关资源
        最近更新 更多