2010-07-01 71 views
1

我的程序中出現MaxOpenPreparedStatement異常。我可以使用getNumActive()/ getNumIdle()函數監視GenericObjectPool中的對象數量。我如何從org.apache.commons.dbcp.BasicDataSource對象獲得連接&準備語句池? 謝謝dbcp:打開準備好的語句的編號

回答

0

DBCP的BasicDataSource公開數據源配置的maxOpenPreparedStatements值。

這個例外的存在似乎表明您正在打開太多的語句和卻沒有關閉它們:

由於連接通常只使用一個或兩個語句的時間,這主要是用來幫助檢測資源泄漏。

+0

這是一個配置值,而不是當前statictics – dbf 2010-07-01 14:00:35

2

我不知道有關的實際問題的答案,但打開的PreparedStatement的最大允許量通常是相當高的。所以,我強烈懷疑,導致你問這個問題的技術問題是JDBC代碼沒有正確關閉所有打開的語句中finally塊按照以下JDBC成語:

Connection connection = null; 
PreparedStatement preparedStatement = null; 
ResultSet resultSet = null; 
// ... 

try { 
    connection = database.getConnection(); 
    preparedStatement = connection.prepareStatement(SQL_STRING); 
    resultSet = preparedStatement.executeQuery(); 
    // ... 
} finally { 
    if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {} 
    if (preparedStatement != null) try { preparedStatement.close(); } catch (SQLException ignore) {} 
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {} 
} 
0

您也許能夠通過繼承BasicDataSource,然後覆蓋createPoolableConnectionFactory並用您自己創建的語句池工廠(因此可以跟蹤)替換語句工廠,獲得DBCP內部部件。

與此處的其他答案一樣,這似乎表示準備好的語句保持打開狀態 - 即使您已將預備語句池關閉(或者完全停止使用連接池),也會出現同樣的問題),這可能會使原始問題更容易調試。