Java ComboPooledDataSource превышает размер пула и не используется повторно

#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. Пол, ты прав, я думал, что только соединение было в попытке — я должен прочитать дважды, прежде чем публиковать.