Допустим, есть код, который находится в серверной части:
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.