2014-03-05 45 views
4

我與使用JDBC(DB2)的數據庫連接有問題。我最近在代碼塊上實現了事務管理(提交/回滾),並且對數據庫上的所有查詢/操作使用相同的連接。我們從來沒有顯式關閉每個查詢/操作之間的連接。但是,在運行時,我們會得到一個異常,提示我們的連接無效(關閉/空)。當我逐步調試時,似乎連接字段意外變爲空。它看起來是隨機的,它不會發生在同一條線上。我相信我們不會自己關閉連接!我們在Tomcat中使用連接池。JDBC連接意外變爲空

下面是一個代碼示例:

try { 
connection = DB.getConnection(); 
connection.setAutoCommit(false); 
savepoint = connection.setSavepoint("avantModif"); 

    /* * Here are some queries and operations that runs without error 
when the connection is not null */  
connection.commit(); 

} 

catch(Exception e) { 

    if (connection != null && !connection.isClosed() && savepoint != null) 
     {   
      connection.rollback(savepoint); 
     } 

    throw e; 
} 

finally 
{ 
if(connection != null){  
    connection.close(); 

} 

這裏是一個調試器屏幕截圖示出連接對象內容:

enter image description here

這裏是在Tomcat中的server.xml連接池定義:

<Resource 
    name="jdbc/dbcpGlobal" 
    auth="Container" 
    type="javax.sql.DataSource" 
    driverClassName="com.ibm.as400.access.AS400JDBCDriver" 
    url="jdbc:as400://lvq400/apilib;naming=system;errors=full;date format=iso;prompt=false;trace=false;reconnect=true" 
    username="[here_is_our_username]" password="[here_is_our_password]" 
    maxIdle="7" maxActive="15" maxWait="5" 
    removeAbandoned="true" removeAbandonedTimeout="120" logAbandoned="true" 
    testOnBorrow="true" testOnReturn="true" validationQuery="select 1 from sysibm/sysdummy1" /> 

對象不是真的null,其內容變爲空!

是否有任何JDBC連接內容會變爲空的原因?

+4

什麼*究竟*你的意思是「連接對象內容」?如果您提供堆棧跟蹤和一些示例代碼,幫助您會容易得多... –

+0

您現在有更多的細節! – Marc

+0

好的,謝謝。現在,'DB.getConnection()'做了什麼?您是否在多個線程中使用相同的連接? –

回答

0

我敢肯定,你實際上應該關閉連接。由於你得到的是一個代理對象,「關閉」它只會將它返回給池。我猜測Tomcat在某些時候開始扼殺你的連接,因爲它們似乎被拋棄了。發生這種情況時日誌中是否有任何內容,因爲您有logAbandoned =「true」?

+0

感謝您的回覆。我們確保我們記錄了Tomcat日誌中的所有異常,並且當我們嘗試執行sql查詢時,我們可以看到的唯一異常就像「錯誤:連接已關閉」。當我們停止使用Connection對象上的事務(提交,回滾)時,問題就消失了。如果發生任何異常,我們設法手動回滾。問題解決了,但我仍然不知道是什麼原因造成的! – Marc