Что такое хороший инструмент для исследования использования соединения с базой данных в Java? - PullRequest
12 голосов
/ 21 января 2010

Что такое хороший инструмент для исследования использования соединения с базой данных в Java?

Разработчик поддерживает сложную Java-программу, которая иногда исчерпывает количество доступных соединений с базой данных. Поскольку проблема носит эпизодический характер, было бы полезно узнать, какой поток открыл несколько соединений с базой данных, чтобы сосредоточить усилия в этой области.

В конце концов, правильное исправление - переписать программу, чтобы повторно использовать соединения, а не открывать несколько соединений на поток.

Я спрашиваю, какие инструменты должен иметь разработчик в своем наборе инструментов, чтобы иметь возможность исследовать ресурсы, то есть соединения с базой данных, которые были выделены потоком.

Ответы [ 5 ]

7 голосов
/ 21 января 2010

Посмотрите на log4jdbc . Он позволяет вам просматривать все данные, проходящие через ваш jdbc, включая открытие / закрытие соединений, а также информацию о номерах соединений.

4 голосов
/ 21 января 2010

Кто-то недавно показал мне ConnLeakFinder , "простой инструмент для определения утечек jdbc-соединения в коде java". До сих пор я не тестировал его сам, но он должен позволить вам видеть, кто не закрывал соединение после использования . См. Соединение + Утечка + Как + Как + Найти.htm .

Но на самом деле вам следует использовать консоль с помощью пула соединений (например, c3p0 ).

3 голосов
/ 30 марта 2016

Не конкретный инструмент, а скорее методика отладки для отслеживания того, какой код отвечает за открытые соединения или другие ресурсы.

Я предполагаю, что вы используете согласованный метод на стороне Java для получения соединения БД (объединено или нет, не имеет значения).

Идея состоит в том, чтобы создать очень легкий класс-оболочку для вашей фабрики соединений / пула или чего бы то ни было. Оболочка будет реализовывать любой интерфейс jdbc, который имеет смысл, так что вы можете поменять его для обычного объекта соединения, но большинство методов просто прозрачно вызывают / возвращают базовое соединение.

Если вы используете какой-то IoC-фреймворк (например, Spring), вы сможете легко поменять класс соединения / фабрики на уровне конфигурации. Теперь весь ваш java-код будет использовать вашу новую оболочку соединения с БД.

Если вы используете пул, то вызов connection.close() обычно просто возвращает объект в пул, а не разрушает соединение. Таким образом, этот метод работает для обычной утечки соединения или просто утечки "не возвращен в пул (пул исчерпан)".

Теперь нам просто нужно зарегистрировать интересные биты и установить ловушку для утечек соединений.

Трассировка стека для идентификации создателя

В методе конструктора или фабрики для вашей оболочки соединений создайте новый объект Throwable и сохраните его как локальную переменную в вашей оболочке для дальнейшего использования. Мы используем Throwable, потому что это быстрее / дешевле, чем Thread.currentThread().getStackTrace().

Установить «ловушку»

Реализуйте метод finalize в своем классе-обертке. Это метод очистки, вызываемый GC, когда объект уничтожается, потому что он больше не используется.

Метод finalize должен проверять "я закрыт?" Если уже закрыто, то все в порядке ... однако, если соединение GCed и оно не было закрыто ... тогда это соединение с утечкой.

Теперь Throwable возвращается в игру. Мы можем взять Throwable и вывести красивое сообщение в журнале, говорящее что-то вроде: «У меня утечка соединения, и вот трассировка стека, затрагивающая моего создателя».

Расширение идеи

Этот метод может быть адаптирован для различных ситуаций. Конечно, вы можете хранить другие типы данных в своей оболочке для устранения проблем, с которыми вы столкнулись. Например время создания. Затем вы можете опросить долгоживущие связи и снова привлечь создателя. Или вы можете опросить существующие соединения и проанализировать трассировки стека Throwable, чтобы получить данные о том, какой код использует сколько соединений со временем.

Вероятно, имеется готовый инструмент, который также может делать такие вещи, но объем кода, необходимый для применения этой техники, в большинстве случаев очень минимален (при условии, что у вас есть простой способ поменять нашу базу фабрика соединений без поиска-замены всей вашей кодовой базы).

1 голос
/ 21 января 2010

Пулы соединений могут дать вам некоторую диагностику. Например, проверьте свойство debugUnreturnedConnectionStackTraces для пула соединений C3P0:

http://www.mchange.com/projects/c3p0/index.html#debugUnreturnedConnectionStackTraces

0 голосов
/ 21 января 2010

P6Spy - это платформа с открытым исходным кодом для поддержки приложений, которые перехватывают и при необходимости изменяют операторы базы данных.

С http://www.p6spy.com/about.html
В дистрибутив P6Spy входят следующие модули:

  • P6Log. P6Log перехватывает и регистрирует операторы базы данных любого приложения, которое использует JDBC. Это приложение особенно полезно для разработчиков, чтобы отслеживать операторы SQL, создаваемые серверами EJB, позволяя разработчику писать код, который достигает максимальной эффективности на сервере. P6Spy разработан для установки за считанные минуты и не требует изменений кода.
  • P6Outage. P6Outage обнаруживает длительные операторы, которые могут указывать на проблему сбоев базы данных, и регистрирует любой оператор, который превышает настраиваемую временную границу во время его выполнения. P6Outage был разработан, чтобы минимизировать любые потери производительности журналирования, регистрируя только долгосрочные операторы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...