Как я отслеживаю осиротевшие соединения JDBC, которые не закрываются?

Перефразировать старую кавычку: у программиста была проблема. Он думал, "Я знаю, я буду использовать потоки". Теперь у программиста есть две проблемы. (Часто приписываемый JWZ, но это, кажется, предшествует его использованию его говорящий о regexes.)

А хорошее эмпирическое правило, "Не используют потоки, если нет очень неопровержимый довод для использования потоков". Несколько потоков напрашиваются на неприятности. Попытайтесь найти хороший способ решить проблему, не используя несколько потоков, и только отступить к использованию потоков при предотвращении, чтобы это было столько же проблемы сколько дополнительное усилие использовать потоки. Кроме того, рассмотрите переключение на несколько потоков, если Вы работаете на многоядерной машине / машине мульти-ЦП, и тестирование производительности единственной потоковой версии показывает что Вы потребность производительность дополнительных ядер.

7
задан user26270 26 October 2009 в 19:39
поделиться

2 ответа

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

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

Если соединение manager - это не ваш код, вы все равно можете добиться того же, используя аспекты.

7
ответ дан 7 December 2019 в 07:47
поделиться

Вы можете реализовать собственный мини-фреймворк или использовать существующий в качестве тонкой оболочки для операций JDBC. Например, существует модуль spring-jdbc ( mavenized ), который охватывает весь шаблонный код, подверженный ошибкам, от разработчика.

Вы можете проверить его примеры использования и убедитесь, что в клиентском коде вообще нет инициализации / очистки! Он использует шаблон 'шаблонный метод' , т.е. вы просто пишете важную обработку данных и не беспокоитесь о создании и закрытии соединений / операторов / наборов результатов. Таким образом, становится невозможным представить проблему, о которой вы говорили вначале.

0
ответ дан 7 December 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: