Mysql java.sql.SQLException:已关闭
我们有一个在tomcat上运行的webapp,带有MySQL后端。有一段时间一切都很好,然后突然我们开始得到这个异常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
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&useSSL=true&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&useSSL=true&requireSSL=true" />
<property name="username" value="${uname}" />
<property name="password" value="${passwd}" />
</bean>
我不知道是什么原因导致了它,但这是一个bug,如果已经关闭,不应该抛出异常:“在已经关闭的连接上调用方法是不可行的”+1您完全正确地发现了问题。我已经发现这个问题与连接池有关,并关闭了连接池。我不接受的唯一原因是我没有尝试你建议的方法…@HarshalWaghmare,想问你关闭连接池是什么意思?我的应用程序运行在IBMWAS上,并使用db2作为数据库。我看到的连接池设置主要是关于最大连接和最小连接大小。但不了解关闭的设置,可以建议吗?仅供参考…“DriverManager数据源”不是真正的连接池。