dbcp:打开预准备语句的数量

时间:2010-07-01 13:35:54

标签: java jdbc apache-commons-dbcp

我的程序中出现MaxOpenPreparedStatement异常。我可以使用getNumActive()/ getNumIdle()函数监视GenericObjectPool中的对象数。我怎样才能获得连接和从org.apache.commons.dbcp.BasicDataSource对象准备语句池? 感谢

3 个答案:

答案 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并将语句池工厂替换为您自己创建的工厂(因此能够跟踪)。

与此处的其他答案一样,这似乎表明准备好的语句处于打开状态 - 在这种情况下,即使您关闭预备语句池(或者根本不使用连接池),您也会遇到相同的问题,这可能会使原始问题更容易调试。