2012-05-15 76 views
0

我正在使用數據源對象從連接池中獲取Oracle JDBC連接。 並使用連接從java中插入一些日誌到數據庫(通過java靜態方法)。 由於每個用戶會有大約10到20次插入,我正在做的是,我在Filter中以請求級別提交連接,並在會話級別關閉連接(通過Session Listener的sessionDestroyed()方法) 我沒有得到在測試中出現任何錯誤,但在生產環境中,我收到的錯誤如下,在連接池中獲取SQLException錯誤

java.sql.SQLException: execute, Exception = null (one scenario) 
java.sql.SQLException: close, Exception = null (for another scenario) 

如何避免這些錯誤?我是否可以在java靜態方法中提交併關閉連接,而不是在請求級別進行提交併在會話級別關閉?

但什麼使我感到有趣的是,這些錯誤是存在的有我的Java靜態方法如下邏輯inspite,

if (con.isClosed() || con == null) { 
DBConnectionHelper connHelper = DBConnectionHelper.createInstance(); 
    con=connHelper.getConnection("ds"); 
    con.setAutoCommit(false); 
} 

所以我檢查上面的,所以有這樣的連接沒有能當我嘗試執行時會被關閉,對嗎? 但不確定和困惑,爲什麼發生。

+0

爲什麼要關閉連接池中的連接?另外,在你的if中,我會在con.isClosed()之前檢查con是否爲空。 – Mike

+0

@Mike:一些連接池攔截'close()'調用,並將連接返回到池中。 – skaffman

+0

@skaffman - 那麼,在第一次連接之前,'con'指向什麼? –

回答

1

我猜你的con對象是null?

考慮以下塊:你問

if (con.isClosed() || con == null) { 
DBConnectionHelper connHelper = DBConnectionHelper.createInstance(); 
    con=connHelper.getConnection("ds"); 
    con.setAutoCommit(false); 
} 

首先,如果連接被關閉。然後你看看它是否爲null。如果con真的是null,你將得到一個NullpointerException。

開關的檢查,看看它是否有助於任何:-)

if (con == null || con.isClosed()) { 
DBConnectionHelper connHelper = DBConnectionHelper.createInstance(); 
    con=connHelper.getConnection("ds"); 
    con.setAutoCommit(false); 
} 
+0

很好,讓我改變這一點,看看。我應該手動關閉連接池對象,當在靜態Java方法中或最後關閉一次(如我在Session Listener中的sessionDestroyed()方法)? –

1

變化

if (con.isClosed() || con == null) { 

if (con == null || con.isClosed()) { 

看看是否是有差別的。

你是如何檢查con=connHelper.getConnection("ds");成功的?
我擔心connull在執行之前con.setAutoCommit(false);
如果是這樣,您需要檢查生產db的連接字符串是否正確。

+0

很好,讓我改變這一點,看看。我應該手動關閉連接池對象,當在靜態Java方法中或最後關閉一次(如我在Session Listener中的sessionDestroyed()方法)? –