Java dbcp:打开的已准备语句数
我的程序中出现MaxOpenPreparedStatement异常。我可以使用getNumActive()/getNumIdle()函数监视GenericObject池中的对象数。如何从org.apache.commons.dbcp.BasicDataSource对象获取连接和准备好的语句池?Java dbcp:打开的已准备语句数,java,jdbc,apache-commons-dbcp,Java,Jdbc,Apache Commons Dbcp,我的程序中出现MaxOpenPreparedStatement异常。我可以使用getNumActive()/getNumIdle()函数监视GenericObject池中的对象数。如何从org.apache.commons.dbcp.BasicDataSource对象获取连接和准备好的语句池? 感谢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内部结构
与这里的其他答案一样,这似乎表明准备好的语句处于打开状态-在这种情况下,即使关闭准备好的语句池(或停止使用连接池),您也会遇到同样的问题,这可能会使原来的问题更容易调试。这是一个配置值,非当前静力学