Одно предложение предотвратить и сообщить об утечке соединения с базой данных:
Сначала выясните объем каждого соединения.
Например, для многих веб-приложений требуется соединение в объеме запроса.
С определенными областями все, что вам нужно сделать, это закрыть соединение детерминированным способом, сделав это в конце жизненного цикла области действия.
Один из способов утверждать, что соединение с базой данных всегда закрыто в веб-приложении, - создать фильтр сервлета, который будет получать соединение при поступлении запроса и закрывать соединение при отправке ответа. Соединение можно передать от фильтра к другим объектам, поместив его в переменную ThreadLocal.
Другой пример области действия - когда для транзакции требуется соединение. Возможно, вы захотите использовать шаблон Execute Around Method , чтобы получить соединение до начала области и закрыть его в конце детерминированным способом.
Если вы реализуете любую из этих идей, вы можете даже записать, какие соединения не были закрыты, прежде чем закрывать ее, чтобы помочь идентифицировать утечку.
Удачи, надеюсь, это поможет, пожалуйста, дайте мне знать иначе.
Обновление:
Я только что решил проблему утечки соединения с базой данных в устаревшем коде, добавив параметры отладки в реализацию пула соединений с базой данных apache DBCP.
Даже если вы не хотите использовать DBCP в рабочей среде, вы все равно можете настроить его на тестирование, чтобы просто определить точный код линии, который заимствовал незакрытое соединение.
В моей среде я использовал tomcat с конфигурацией источника данных JNDI следующим образом:
<Resource auth="Container"
name="jdbc/APP_NAME"
username="user"
password="password"
url="jdbc:oracle:thin:@server.domain:1521:development"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
maxIdle="10"
maxWait="5000"
maxActive="10"
validationQuery="select 1 from dual"
validationInterval="30000"
testOnBorrow="true"
testOnReturn="false"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="5000"
numTestsPerEvictionRun="3"
minEvictableIdleTimeMillis="30000"
<!-- These 3 settings saved me hours of headache -->
logAbandoned="true" <!-- Will report the stacktrace of the faulty code -->
removeAbandoned="true" <!-- Will remedy the connection starvation while leaky code is not fixed-->
removeAbandonedTimeout="60"<!-- Interval for fixing connection starvation while leaky code is not fixed-->
/>
См .: Конфигурация Apache DBCP