2010-06-04 105 views
0

我有一個場景,問題如下Java JDBC連接和Oracle

應用程序服務器有兩個到DB的連接池。 AB

A點 - >DatabaseA - >已128 connections

A已經存儲了訪問表駐留在DatabaseBDB link

B點用程序 - >DatabaseB - >具有36 connections

現在讓我們說通過使用連接poo,Java代碼調用DatabaseA中的Stored Proc l A。該存儲過程是從DatabaseB

問題獲取數據在DB鏈接:

基於這種方案如果我們在前端connection closed錯誤。是否可行的說,儘管java正在從池A(128)調用SP(在DatabaseA中),但由於SP正在從DatabaseB中提取數據,它的連接數量較少(36)。

基本上我想知道什麼時候數據通過數據庫鏈接,像這樣...是否從分配給池B pointint的36個連接帶到DatabaseB?

精確異常 精確例外,我得到的是:--- Cause: java.sql.SQLException: Closed Connection

一些堆棧跟蹤:

產生的原因:java.sql.SQLException中:在 com.ibatis.sqlmap 關閉連接。 engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:185) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStateme nt.java:123) 在 com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:614) 在 com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java: 588) 在 com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118) 在 org.springframework.orm.ibatis.SqlMapClientTemplate $ 3.doInSqlMapClient(SqlMapClientTemplate.java:268) 在 org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:193) at org.springframework.orm.ibatis.SqlMapClientTemplate.executeWithListResult(SqlMapClientTemplate.java :219) 在 org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:266)

而且,我使用iBatis的...所以沒有try..catch..finally

+1

它不應該。請更新您的問題以包含確切的異常和數據源配置。 – BalusC 2010-06-04 22:56:06

回答

0

這個異常表明資源泄漏,即JDBC代碼沒有正確地關閉finally塊中的連接(以確保它即使在發生異常時也會關閉),或者連接已在多個線程之間共享。如果兩個線程共享來自池的同一連接並且一個線程關閉它,那麼當其他線程使用連接時會發生此異常。

應編寫JDBC代碼,以便在同一個方法塊中獲取並關閉(以相反順序)連接(以及語句和結果集)。例如。

Connection connection = null; 
// ... 
try { 
    connection = database.getConnection(); 
    // ... 
} finally { 
    // ... 
    if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
} 

另一個可能的原因是池正在保持連接太長時間閒置,而不是在釋放前測試/驗證它們。這可以在一個體面的連接池中進行配置。請查閱其文檔。

0

「基本上我想知道什麼時候數據通過數據庫鏈接傳入,就像這樣......是否從連接池B分配的36個連接帶到DatabaseB?」

否。數據庫服務器將與其他數據庫服務器建立獨立連接,而不考慮任何連接池。

我不得不忍受一段時間不活動後連接斷開的防火牆,所以我發現這個錯誤非常多。查看dbms_session.close_database_link,因爲數據庫鏈接連接通常會在會話期間保持不變(因爲您有連接池,該會話可能會持續很長時間)。

+0

我也有類似的東西。如果它們長時間運行(9秒),它會殺死會話,但這個殺手級作業只運行在數據庫A中。當發生這種情況時,我實際上看到「您的會話已被殺害」而不是「關閉連接」 – john 2010-06-05 04:18:33

+0

您是否建議在存儲過程結束時,我應該有dbms_session.close_database_link?或者在我不使用數據庫鏈接的表之後關閉數據庫鏈接? – john 2010-06-05 04:22:20

+0

我建議你在我的存儲過程中關閉數據庫鏈接,在事務 – 2010-06-06 01:49:52

2

存儲過程運行的數據庫中;當它連接到另一個數據庫時,它將建立直接連接,但不會通過應用程序服務器的池。實際上,它可以連接到鏈接到A的任何數據庫,而不管是否有應用程序服務器維護的數據庫的連接池。