Утечка соединения с БД - PullRequest
2 голосов
/ 29 февраля 2012

Каков наилучший способ узнать, какая часть моего Java-кода открывает соединение с БД, но не закрывает его? Я застрял в большом пакетном процессе, в котором трудно решить эту проблему. Я использую сервер приложений JBOSS.

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Findbugs имеет два правила, которые могут помочь. Я всегда находил это полезным:

ODR: метод может не закрыть ресурс базы данных (ODR_OPEN_DATABASE_RESOURCE)

Метод создает ресурс базы данных (например, соединение с базой данных). или набор строк), не присваивает его никаким полям, передает его другим методы или вернуть его, и не появляется, чтобы закрыть объект на всех пути из метода. Неспособность закрыть ресурсы базы данных на всех пути из метода могут привести к снижению производительности и вызвать у приложения возникли проблемы с подключением к базе данных.

ODR: метод может не закрыть ресурс базы данных при исключении (ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH)

Метод создает ресурс базы данных (например, соединение с базой данных). или набор строк), не присваивает его никаким полям, передает его другим методы или вернуть его, и не появляется, чтобы закрыть объект на всех пути исключения из метода. Неспособность закрыть базу данных ресурсы на всех путях вне метода могут привести к снижению производительности, и может вызвать проблемы с приложением база данных.

Справка:

2 голосов
/ 29 февраля 2012

Если вы не можете пройтись по коду, я бы предложил старомодный способ, добавьте кучу System.outs и вставьте детали в операторы out, которые могут помочь вам выяснить, когда соединение открывается.Возможно, вы сможете довольно точно определить, какая часть вашего кода это делает.По крайней мере, это может уменьшить объем кода, на котором вам нужно сосредоточиться.

1 голос
/ 02 марта 2012

У источников данных JBoss всегда был флаг для этой цели

(из DTD источников данных):

<!-- Whether to check for unclosed statements when a
     connection is returned to the pool and result sets are
     closed when a statement is closed/return to the prepared
     statement cache.
     valid values are:
     false - do not track statements and results
     true - track statements and result sets and warn when they are not closed
     nowarn - track statements but do no warn about them being unclosed (the default)
     e.g.
     <track-statements>nowarn</track-statements>
--> 

Таким образом, в вашем файле *-ds.xml вы устанавливаете элемент на true и просмотрите журнал сервера после этого.

...