Mysql java.sql.SQLException:已关闭

Mysql java.sql.SQLException:已关闭,mysql,spring,tomcat,Mysql,Spring,Tomcat,我们有一个在tomcat上运行的webapp,带有MySQL后端。有一段时间一切都很好,然后突然我们开始得到这个异常java.sql.SQLException:已经关闭。 整个堆栈跟踪是: DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Fetching JDBC Connection from DataSource DEBUG [org.springframework.jdbc.datasource.DataSourceU

我们有一个在tomcat上运行的webapp,带有MySQL后端。有一段时间一切都很好,然后突然我们开始得到这个异常
java.sql.SQLException:已经关闭。

整个堆栈跟踪是:

DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Fetching JDBC Connection from DataSource
DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Returning JDBC Connection to DataSource
DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Could not close JDBC Connection    
java.sql.SQLException: Already closed.
    at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:114)
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:191)
    at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:333)
    at org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(DataSourceUtils.java:294)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:405)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:428)
    at com.nokia.analytics.aws.aggregate.service.importer.DBInsert.truncateTable(DBInsert.java:135)
    at com.blah.analytics.aggregate.service.importer.AggregateCollector.pullAndInsert(AggregateCollector.java:85)
    at com.blah.analytics.aggregate.service.importer.AggregateCollector.call(AggregateCollector.java:96)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:679)
我们使用
org.apache.commons.dbcp.BasicDataSource
作为数据源。我找了不少,但都没找到。 它并不总是发生,因此很难复制。db连接池似乎有问题。有人建议将param设置为负值。目前,我们没有更改这些参数(所有参数都有默认VAL)

我们应该采取什么方法来避免它

编辑:

相关代码位于(DBInsert.java)中

133:
String sql=“DELETE FROM”+tableName

134:
logger.debug(sql)

135:
this.jdbcTemplate.execute(sql)

(133-135为例外情况中规定的行号)

我的数据源配置:

<bean id="bisToolDataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url"
            value="${url}/blah_db?verifyServerCertificate=false&amp;useSSL=true&amp;requireSSL=true" />
        <property name="username" value="${uname}" />
        <property name="password" value="${passwd}" />
    </bean>

此问题的原因是连接在很长时间内未使用,请将
testOnBorrow
validationQuery
属性添加到数据源配置中,然后应用程序将正常工作
祝你好运:)

正如用户NobodyElse指出的,问题与连接池有关。我使用
org.apache.commons.dbcp.BasicDataSource
作为数据源。应用程序的性质是,在一天中的某个固定时间有大量连接,而在一整天中根本没有连接。所以,由于池中的连接变得陈旧,当第二天应用程序尝试连接到DB时,我们遇到了这个异常

基本上有两种解决方案: NobodyElse指出的一个,即使用
testOnBorrow
;详情见

另一个解决方案(我为我们的应用程序使用)是完全关闭池。注意:仅当应用程序不是DB密集型时才执行此操作(在我们的例子中是这样的)。因此,我切换到
org.springframework.jdbc.datasource.DriverManagerDataSource
。它似乎工作正常的配置是:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url"
            value="${url}/blah_db?verifyServerCertificate=false&amp;useSSL=true&amp;requireSSL=true" />
        <property name="username" value="${uname}" />
        <property name="password" value="${passwd}" />
</bean>


我不知道是什么原因导致了它,但这是一个bug,如果已经关闭,不应该抛出异常:“在已经关闭的
连接上调用
方法是不可行的”+1您完全正确地发现了问题。我已经发现这个问题与连接池有关,并关闭了连接池。我不接受的唯一原因是我没有尝试你建议的方法…@HarshalWaghmare,想问你关闭连接池是什么意思?我的应用程序运行在IBMWAS上,并使用db2作为数据库。我看到的连接池设置主要是关于最大连接和最小连接大小。但不了解关闭的设置,可以建议吗?仅供参考…“DriverManager数据源”不是真正的连接池。