我的程序中出现MaxOpenPreparedStatement异常。我可以使用getNumActive()/ getNumIdle()函数监视GenericObjectPool中的对象数。我怎样才能获得连接和从org.apache.commons.dbcp.BasicDataSource对象准备语句池? 感谢
答案 0 :(得分:2)
我不确定实际问题的答案,但打开的预备文件的最大允许数量通常很高。因此,我强烈怀疑导致您提出这个问题的技术问题是JDBC代码没有按照以下JDBC习惯用法正确关闭finally
块中的所有已打开语句:
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) {}
}
答案 1 :(得分:0)
DBCP的BasicDataSource公开了配置数据源的maxOpenPreparedStatements值。
此异常的存在似乎表明您打开的语句太多而不是关闭它们:
由于连接通常一次只使用一个或两个语句,因此主要用于帮助检测资源泄漏。
答案 2 :(得分:0)
您可以通过继承BasicDataSource来获取DBCP内部,然后覆盖createPoolableConnectionFactory并将语句池工厂替换为您自己创建的工厂(因此能够跟踪)。
与此处的其他答案一样,这似乎表明准备好的语句处于打开状态 - 在这种情况下,即使您关闭预备语句池(或者根本不使用连接池),您也会遇到相同的问题,这可能会使原始问题更容易调试。