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服務,並且這些線程顯示執行人試圖得出結論,有一個資源數據庫開放線程。
這裏就是我呼籲我的各種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();
}
}
我這個花了很多時間總額,但無論我做什麼,我似乎無法拉刺出這個代碼。
如果可以,請協助。
結束了在一些代碼完全等和完全忘記部分發現問題。感謝壽。 – Lurk21 2013-03-03 21:55:33