Я получаю исключение MaxOpenPreparedStatement в своей программе. Я могу контролировать количество объектов в GenericObjectPool с getNumActive ()/getNumIdle () функции. Как я могу делать пересадку и подготовленные пулы оператора от org.apache.commons.dbcp. Объект BasicDataSource?Спасибо
Я не уверен в ответе на актуальный вопрос, но максимально допустимое количество открытых подготовленных заявлений обычно довольно велико. Поэтому я сильно подозреваю, что техническая проблема, из-за которой вы задаете этот вопрос, заключается в том, что код 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) {}
}
DBCP's BasicDataSource предоставляет значение maxOpenPreparedStatements , с которым сконфигурирован источник данных.
Присутствие этого исключения, кажется, указывает на то, что вы открываете слишком много операторов, но не закрываете их, однако:
Поскольку соединение обычно использует только один или два оператора за раз, это в основном используется для помощи в обнаружении утечек ресурсов .