Библиотека пула соединений JDBC, которая может нормально обрабатывать соединения, которые простаивают? - PullRequest
0 голосов
/ 28 мая 2019

Допустим, есть код, который находится в серверной части:

class Foo {
    void doSomething() {
        try (Connection c = dataSource.getConnection()) {
            executeSQL(c);
            externalApiCall(); // this can be slow
            executeSQL(c);
        }
    }
}

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

Приведенный выше код упрощен, и в действительности я использую что-то вроде ServletFilter, который помещает Connection в ThreadLocal при получении http-запроса, поэтому сложно изменить общий механизм, открывающий Connection в начале бизнес-логики.

Итак, мой вопрос: нет ли какой-нибудь хорошей библиотеки пулов соединений, обертки или чего-то, что может хорошо справиться с такой ситуацией? Например, что-то, что открывает реальное соединение с базой данных только при создании объекта Statement и автоматически закрывает соединение после закрытия Statement. В настоящее время я использую Tomcat DBCP.

1 Ответ

0 голосов
/ 28 мая 2019

Использовать пул соединений cp3.

Свойство max_idle_time может удовлетворить ваши требования здесь.

  • maxIdleTime

По умолчанию:0

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

Для получения дополнительной информации см. https://www.mchange.com/projects/c3p0/

...