JVM が PostgreSQL データベース (Linux 上) に接続している場合、Java のどのスレッドがデータベースのプロセスを担当しているかを調べる方法はありますか?
注意: リソース リークのバグをデバッグしています。これは、データベース内のアイドル状態のトランザクション プロセスとして表示されます。スレッド名によって検索が絞り込まれるため、これらを担当スレッドと一致させると便利です。
JVM が PostgreSQL データベース (Linux 上) に接続している場合、Java のどのスレッドがデータベースのプロセスを担当しているかを調べる方法はありますか?
注意: リソース リークのバグをデバッグしています。これは、データベース内のアイドル状態のトランザクション プロセスとして表示されます。スレッド名によって検索が絞り込まれるため、これらを担当スレッドと一致させると便利です。
application_name (SET
ステートメントを使用) を、Java スレッド名と一致するものに設定できます。
便利なトリックは、SIGQUIT シグナルを Java プロセスに送信することです。
kill -QUIT your_process_id
それを殺すことはありませんが、スレッドダンプを出力するように指示します。これにより、すべてのスレッドがリストされ、現在実行中のバックトレースが表示されます。残念ながら、これには通常、「conn.setAutoCommit(false)」ほど明らかなものは含まれませんが、各スレッドの場所がわかります。
次に、コード内のそれらのポイントを見つけて、コミット/ロールバックによって一致しないトランザクションの開始が先行するかどうかを確認するためにトレースバックを試みることができます。
アプリケーションを作成するときに役立つもう 1 つのことは、接続を作成および制御する共通の場所 (つまり、さらに別の抽象化レイヤー!) を用意することです。これは、接続が作成されてスレッドに割り当てられたとき、およびそれらのいずれかでトランザクションが開始されたときに、ログ記録用のステートメントを配置するのに適した場所になります。