Мы наблюдаем ситуации, когда соединение с нашей базой данных из org.apache.commons.dbcp.BasicDataSource
умирает с ошибками записи в сокет:
com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error
Все последующие попытки записи в соединение терпят неудачу, конечно:
com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
После обновления кода, чтобы перехватить такие исключения и запросить новое соединение, когда оно происходит, оно снова не удалось. Правильно ли я подозреваю, что вызов DataSource#getConnection()
фактически не дает новое соединение каждый раз, когда он вызывается? Разве это не просто повторное использование существующего соединения, которое закрыто?
Если я прав, как правильно отбросить старое соединение и запросить новое?
РЕДАКТИРОВАТЬ: Вот более лаконичная версия того, что я хотел бы знать:
Connection c1, c2;
c1 = DatabaseManager.getConnection();
// c1.close() not called
c2 = DatabaseManager.getConnection();
Является ли "c1 == c2" верным утверждением? Или было выделено два соединения? И если это последнее, будет ли такой код представлять собой «утечку пула соединений»:
Connection c1;
c1 = DatabaseManager.getConnection();
// c1.close() not called
c1 = DatabaseManager.getConnection();