2010-07-01 5 views
1

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

ответ

0

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

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

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

+0

Это значение конфигурации, а не текущая статистика – dbf

2

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

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

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

Смежные вопросы