Полезный трюк состоит в том, чтобы отправить сигнал SIGQUIT в процесс Java, например.
kill -QUIT your_process_id
Который не убьет его, но скажет ему распечатать свалку потока. В этом списке будут перечислены все потоки с обратным отображением того, что они сейчас делают. К сожалению, это обычно не содержит ничего очевидного, как «conn.setAutoCommit (false)», но он расскажет вам, где находится каждый поток.
Затем вы можете найти эти точки в коде и попытаться отследить назад, чтобы увидеть, не начались ли транзакции по транзакциям, которые не имеют себе равных в результате коммитов/откатов.
Другое, что полезно при написании приложения, - это иметь общее место, где соединения создаются и контролируются (т. Е. Еще один слой абстракции!). Это становится хорошим местом для постановки операторов для ведения журнала, когда соединения создаются и назначаются потокам, и когда транзакция начинается с одного из них.
Несомненно, в базе данных есть * соединение *, которое потенциально может использоваться несколькими потоками (например, путем объединения пулов). –
Во многих приложениях соединения будут явно назначены потоку. Соединения в общем случае не должны использоваться одновременно несколькими потоками (реализация может сделать это возможным, но многие этого не делают). Конечно, может быть более эффективным иметь пул соединений, который будет повторно использовать потоки соответствующим образом, но программы в дикой природе часто этого не делают. Иногда проще назначать соединения. Зачем усложнять вопрос? – Edmund