2010-07-25 1 views
2

Я пытаюсь отслеживать течь соединения. (В частности, я замечаю, что соединения остаются открытыми после закрытия последнего DataSource, используя C3P0 для объединения пулов. Я подозреваю ошибку, но хочу, чтобы я не был просто глупым в первую очередь.)Связывание связей Postgres с кодом Java

Есть ли хороший способ связать открытые соединения с точки зрения Postgres

 
postgres=# select * from pg_stat_activity; 

datid | datname | procpid | usesysid | usename |   current_query   | waiting |   xact_start   |   query_start   |   backend_start   | client_addr | client_port 
11564 | postgres | 95709 |  10 | postgres | select * from pg_stat_activity; | f  | 2010-07-25 14:20:24.97529-07 | 2010-07-25 14:20:24.97529-07 | 2010-07-25 14:20:19.066576-07 |    |   -1 

(1 row) 

с местом они были открыты в коде Java/JDBC? (Или, может быть, какая-то уникальная строка и т. Д.) Похоже, это должно быть полезно!

ответ

1

Postgresql 9 поддерживает настройку application_name, которая может быть прочитана таким образом, но на сервере нет ничего подобного для версий до этого.

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

+0

Угадай, мне просто нужно подождать! –

+0

Ну, Postgres 9 выходит, и это решение работает блестяще. –

0

Это невозможно проверить на стороне PostgreSQL. Он ничего не знает о коде Java. Вызывающий абонент должен просто ввести имя пользователя, пароль и имя базы данных. Больше ничего. Тем не менее, это можно проверить на стороне Java. Такие инструменты, как log4jdbc, могут быть полезны в этом.

+0

Я понимаю, что это не ** требуется ** со стороны Postgres, но я надеюсь, что есть какой-то неиспользуемый параметр подключения или даже просто параметр «имя» где-то, что удобно для использования для вещей как это. –

+0

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