Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java dbcp:打开的已准备语句数_Java_Jdbc_Apache Commons Dbcp - Fatal编程技术网

Java dbcp:打开的已准备语句数

Java dbcp:打开的已准备语句数,java,jdbc,apache-commons-dbcp,Java,Jdbc,Apache Commons Dbcp,我的程序中出现MaxOpenPreparedStatement异常。我可以使用getNumActive()/getNumIdle()函数监视GenericObject池中的对象数。如何从org.apache.commons.dbcp.BasicDataSource对象获取连接和准备好的语句池? 感谢DBCP的BasicDataSource公开了数据源配置的值 出现此异常似乎表明您打开的语句太多,但没有关闭它们: 由于一个连接通常一次只使用一个或两个语句,因此这主要用于帮助检测资源泄漏 我不确定实

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

DBCP的BasicDataSource公开了数据源配置的值

出现此异常似乎表明您打开的语句太多,但没有关闭它们:

由于一个连接通常一次只使用一个或两个语句,因此这主要用于帮助检测资源泄漏


我不确定实际问题的答案,但开放式准备声明的最大允许数量通常相当高。因此,我强烈怀疑导致您提出这个问题的技术问题是,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) {}
}

通过子类化BasicDataSource,然后重写createPoolableConnectionFactory并用您自己创建的语句池工厂替换语句池工厂(从而能够跟踪),您可能能够获得DBCP内部结构


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

这是一个配置值,非当前静力学