2012-04-04 3 views
2

Учитывая, что JVM подключается к базе данных PostgreSQL (в Linux), есть ли способ узнать, какой поток в Java отвечает за процесс в базе данных?Какой поток Java отвечает за процесс базы данных PostgreSQL?

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

+0

Несомненно, в базе данных есть * соединение *, которое потенциально может использоваться несколькими потоками (например, путем объединения пулов). –

+0

Во многих приложениях соединения будут явно назначены потоку. Соединения в общем случае не должны использоваться одновременно несколькими потоками (реализация может сделать это возможным, но многие этого не делают). Конечно, может быть более эффективным иметь пул соединений, который будет повторно использовать потоки соответствующим образом, но программы в дикой природе часто этого не делают. Иногда проще назначать соединения. Зачем усложнять вопрос? – Edmund

ответ

5

Вы можете установить имя_приложения (с оператором SET) на то, что вы можете сопоставить с именем потока Java.

5

Полезный трюк состоит в том, чтобы отправить сигнал SIGQUIT в процесс Java, например.

kill -QUIT your_process_id 

Который не убьет его, но скажет ему распечатать свалку потока. В этом списке будут перечислены все потоки с обратным отображением того, что они сейчас делают. К сожалению, это обычно не содержит ничего очевидного, как «conn.setAutoCommit (false)», но он расскажет вам, где находится каждый поток.

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

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

+0

Re logging и уровень абстракции, пул соединений BoneCP поставляется с некоторой полезной поддержкой отладки, включая 'config.setCloseConnectionWatch()' - которая создает вспомогательный поток для просмотра несвободных соединений (поставляется с предупреждением о производительности). –