dbcp: номер открытого подготовленного заявления - PullRequest
1 голос
/ 01 июля 2010

Я получаю исключение MaxOpenPreparedStatement в моей программе. Я могу отслеживать количество объектов в GenericObjectPool с помощью функций getNumActive () / getNumIdle (). Как получить соединение и подготовленные пулы операторов из объекта org.apache.commons.dbcp.BasicDataSource? Спасибо

Ответы [ 3 ]

2 голосов
/ 02 июля 2010

Я не уверен насчет ответа на фактический вопрос, но максимально допустимое количество открытых подготовленных заявлений обычно довольно велико.Поэтому я сильно подозреваю, что техническая проблема, которая заставляет вас задать этот вопрос, заключается в том, что код 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 голосов
/ 17 февраля 2011

Возможно, вы сможете овладеть внутренними компонентами DBCP, создав подкласс BasicDataSource, затем переопределив createPoolableConnectionFactory и заменив фабрику пула операторов созданной вами (и, следовательно, способной отслеживать).другие ответы здесь, это может показывать, что подготовленные операторы остаются открытыми - в этом случае у вас возникнет та же проблема, даже если вы отключите пул подготовленных операторов (или вообще прекратите использовать пул соединений), что может сделатьисходную проблему намного проще отладить.

0 голосов
/ 01 июля 2010

BasicDataSource DBCP предоставляет значение maxOpenPreparedStatements , с которым настроен источник данных.

Наличие этого исключения, по-видимому, указывает на то, что вы открываете слишком много операторов, но не закрываете их:

Поскольку соединение обычно использует только один или два оператора за раз, это в основном используется для обнаружения утечек ресурсов.

...