Wir haben eine Webapp läuft in der Produktion auf Tomcat mit einem MySQL-Back-End. Alles war für einige Zeit in Ordnung, dann plötzlich haben wir begonnen, diese Ausnahme immer java.sql.SQLException: Already closed.
java.sql.SQLException: Bereits geschlossen
Der gesamte Stack-Trace ist:
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)
Wir org.apache.commons.dbcp.BasicDataSource
als unsere Datenquelle verwenden. Ich suchte ziemlich viel, aber ohne Erfolg. Es tritt nicht immer auf und ist daher sehr schwer zu reproduzieren. Es scheint ein Problem mit dem Db-Verbindungs-Pooling zu sein. Irgendwo wurde vorgeschlagen, this param als negativ zu setzen. Derzeit ändern wir diese Parameter nicht (alle haben Standardwerte).
Welchen Ansatz sollten wir befolgen, um dies zu vermeiden?
EDIT:
der entsprechende Code ist in (DBInsert.java)
133: String sql = "DELETE FROM "+tableName;
134: logger.debug(sql);
135: this.jdbcTemplate.execute(sql);
(133-135 sind Zeilennummern, die in der Ausnahme angegeben sind)
Meine Datenquelle config:
<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>
wo ist dein Code? –
Ich weiß nicht, was es verursacht, aber es ist ein Fehler, ['Connection.close()'] (http://docs.oracle.com/javase/7/docs/api/java/sql/Connection. html # close()) sollte keine Ausnahme auslösen, wenn sie bereits geschlossen ist: _ "Die Methode' close' auf einem 'Connection'-Objekt aufzurufen, das bereits geschlossen ist, ist ein No-Op" _ –