2013-05-02 10 views
5

Bir MySQL arka uç ile tomcat üzerinde çalışan bir webapp var. Bizim veri kaynağı olarak org.apache.commons.dbcp.BasicDataSource kullanıyorjava.sql.SQLException: Zaten kapalı

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) 

: Tüm sonra aniden bu istisnayı java.sql.SQLException: Already closed.

tüm yığın izlemesi başlarken, bir ara iyiydi. Ben biraz aradım ama boşuna. Her zaman oluşmaz ve bu nedenle çoğaltılması çok zordur. Db bağlantı havuzu ile ilgili bir sorun gibi görünüyor. Bir yerlerde this parametresi negatif olarak ayarlanması önerildi. Şu anda bu parametreler değişmiyor (tümü varsayılan vals var).

Bundan kaçınmak için hangi yaklaşımı takip etmeliyiz?

DÜZENLEME:

ilgili kodu (DBInsert.java) içinde

133 geçerli: String sql = "DELETE FROM "+tableName;

134: logger.debug(sql);

135: this.jdbcTemplate.execute(sql);

(133-135 vardır istisnada belirtilen satır no.)

Benim veri kaynağı yapılandırma: Bu sorunun

<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> 
+0

Kodunuz nerede? –

+0

Bunun nedenini bilmiyorum, ama bir hata, ['Connection.close()'] (http://docs.oracle.com/javase/7/docs/api/java/sql/Connection. html # close()), eğer zaten kapalıysa bir istisna atmamalısınız: _ "Zaten kapalı olan bir' Connection 'nesnesindeki' close' metodunu çağırmak bir op-op'tur ”_ –

cevap

13

nedeni bağlantısı ardından uygulama ince çalışacak, uzun zamandır kullandığınız veri kaynağı yapılandırmasına testOnBorrow ve validationQuery özellik eklemek değil mi.
İyi şanslar :) kullanıcıya NobodyElse gibi

+0

+ 1 sorun. Problemin bağlantı havuzuyla ilgili olduğunu ve bağlantı havuzunu kapattığını daha önce anladım. –

+0

Kabul etmemin tek nedeni, sizin tarafınızdan önerilen yaklaşımı denemediğim için ... –

+0

@HarshalWaghmare, bağlantı havuzu kapatılarak ne demek istiyorsunuz diye sormak ister misiniz? Uygulamam IBM WAS üzerinde çalışıyor ve veritabanı olarak db2 kullanıyor. Çoğunlukla bağlantı havuzu ayarını görebildiğim maksimum bağlantı ve minimum bağlantı boyutu hakkındadır. Ama kapalı ayarı hakkında değil, tavsiye edebilir misiniz? –

6

işaret, sorun bağlantı havuzu ilgiliydi. Veri kaynağı olarak org.apache.commons.dbcp.BasicDataSource kullanıyordum. Uygulamanın niteliği, günün belirli saatlerinde bağlantıların kesilmesi ve tüm gün boyunca hiçbir bağlantının olmamasıdır. Yani havuzdaki bu bağlantılar nedeniyle bayatlıyordu ve ertesi gün uygulama DB'ye bağlanmaya çalıştığında, bu istisnayı alıyorduk.

iki çözüm bu temelde vardır: biri, o testOnBorrow kullanmaktır NobodyElse tarafından işaret; Ayrıntılar here

Diğer çözüm (uygulamamız için kullandığım), havuzu tamamen kapatmaktır. Not sadece uygulama DB yoğun değilse (bizim durumumuzda doğru olan) bunu yapın. Bu yüzden org.springframework.jdbc.datasource.DriverManagerDataSource'a geçtim. İyi çalıştığını düşündüğünüz yapılandırma:

<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> 
+0

FYI .... "DriverManagerDataSource" gerçekten bağlantı havuzu değil. http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/jdbc/datasource/DriverManagerDataSource.html – kosa