0

バックエンド PostgreSQL データベースを多用するデーモン プロセスがあります。netstat を使用すると、ESTABLISHED で開いている DB へのネットワーク接続が着実に増加していることがわかります。

メモリ ダンプには大量のjava.lang.ref.Finalizer. また、スレッド ダンプには、次のすべてのスレッドが表示されます。

"pool-1-thread-6" prio=10 tid=0x0000000000e4d800 nid=0x10eb waiting on condition     [0x00007f3736c5b000]
 java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000c5524bf8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

これは、固定スレッド プール Executor Service を使用しているためだと思われます。これらのスレッドは、Executor が DB へのリソースを開いているスレッドを終了しようとしていることを示しています。

ここで、さまざまな DB リソースの終了を呼び出します。

    InitialContext ctx = null;
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;

           ... 

    } finally {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            Notification n = new Notification(this,e);
            n.log();
        }
        try {
            if (ps != null) {
                ps.close();
            }
        } catch (SQLException e) {
            Notification n = new Notification(this,e);
            n.log();
        }
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            Notification n = new Notification(this,e);
            n.log();
        }
        try {
            if (ctx != null) {
                ctx.close();
            }
        } catch (NamingException e) {
            Notification n = new Notification(this,e);
            n.log();
        }
    }

私はこれにかなりの時間を費やしましたが、何をしても、このコードからとげを引き抜くことができないようです。

できれば手伝ってください。

4

1 に答える 1

1

最初のステップとして、新しい自動リソース管理機能を使用して接続を閉じることをお勧めします。

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

于 2013-02-28T20:57:05.877 に答える