Допустим, есть этот код, который находится на стороне сервера:
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.
externalApiCall
займет много времени, я предлагаю вам выполнить его, не открывая соединение, или вручную открывать/закрывать соединения в нужное время. Выполнение того, что вы предлагаете, приведет только к трудному для понимания коду с большим количеством волшебства, которое может нарушить ожидания людей (например, в отношении транзакционности и т. д.). - person Mark Rotteveel   schedule 28.05.2019