#java #datasource #limit #connection-pooling #c3p0
#java #источник данных #ограничение #соединение-объединение в пул #c3p0
Вопрос:
У меня есть следующий код, который вызывается другим приложением (которое я не могу изменить) для чтения из базы данных.
Метод вызывается в цикле очень часто и дозирует базу данных.
В базе данных я вижу, что открыто много подключений… увеличивается до нескольких сотен… и затем произошел сбой базы данных из-за нагрузки.
// Called in a loop
private <T> T execute(String query, PostProcessor<T> postProc, PreProcessor preProcs) throws OperationFailedException {
try (Connection conn
= Objects.requireNonNull(dataSourceRef.get(), "No Connection").getConnection();
PreparedStatement smt = conn.prepareStatement(query)) {
preProc.process(smt);
return postProc.process(smt.executeQuery());
} catch (SQLException e) {
throw new OperationFailedException(e.getMessage(), e);
}
}
источник даты инициализируется раньше …
// class variable
// AtomicReference<PooledDataSource> dataSourceRef = new AtomicReference<PooledDataSource>();
// Init method
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass(config.getConnectionDriver());
cpds.setJdbcUrl(config.getConnectionString());
cpds.setUser(config.getConnectionUser());
cpds.setPassword(config.getConnectionPassword());
// cpds.setMaxPoolSize(10);
dataSourceRef.getAndSet(cpds);
Мой вопрос, почему это происходит.
Я думал, что из-за объединения не для каждого запроса следует использовать новые соединения.
Также при установке максимального размера пула это не работает.
Также я попробовал это с помощью конструкции try-catch-finally и закрытия stm и conn после использования. (Как я где-то читал, это, наконец, может быть вызвано с задержкой в сценариях с высокой нагрузкой… Я думаю, что это может быть так)
Но все же почему превышен размер пула? Как я могу ограничить это и заблокировать метод до тех пор, пока соединение снова не станет доступным, прежде чем продолжить?
Комментарии:
1. @ScaryWombat: Разве это не делается синтаксисом try() неявно?
2. Пол, ты прав, я думал, что только соединение было в попытке — я должен прочитать дважды, прежде чем публиковать.