作者icecastleo (酷捏)
看板java
標題Re: [蟲?] While(ture)迴圈中斷
時間Thu Oct 29 13:02:01 2009
昨天的程式跑到今天早上又結束了
後來發現是 Thread 會有
java.lang.OutOfMemoryError: Java heap space
我想請問一段程式碼
關於連結 DB
public void insertTable(ArrayList<News> news) // News 是要存入資料庫的 Object
{
String insertSQL = "insert into XX values (XX) ";
Connection con = null;
PreparedStatement pst = null;
try
{
con = getConnection();
pst = con.prepareStatement(insertSQL);
News temp;
for(int i = 0; i < news.size() ; i++)
{
temp = news.get(i);
pst.set....
pst.addBatch();
}
pst.executeBatch();
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
pst.close();
con.close();
}
catch(SQLException e)
{
System.out.println("Close Exception :" + e.getMessage());
}
}
}
大概有20個 Thread 會同時跑這個方法
所以我把 Connection 跟 PrepareStatement 寫在 fuction裡
Connection 取得的方法 getConnection
是我用 proxool 做了一個 Connection Pool
若是 connection 被取完了 就等待x秒
請問我這樣的寫法
會造成有些東西不能 gc 嗎
或是我少關了什麼
還是我需要 clearBatch();
才能 close PrepareStatement?
※ 引述《icecastleo (酷捏)》之銘言:
: 我有一個While迴圈
: 每隔一段時間會開啟 Thread
: 接著 Sleep
: 但程式有時候會自動結束
: 大概一天
: 主程式並沒有 Throw 任何 Exception
: 請問我要怎麼知道
: Java程式自動關閉的原因?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.167.7.129
推 PsMonkey:請不要用「--」當分隔線 10/29 13:42
推 PsMonkey:其他的... 我想你自己作測試 or 找軟體幫你測試就知道了 10/29 13:43
→ PsMonkey:我會猜你的問題出在 news 超級大,還有 10/29 13:43
推 PsMonkey:下次別再輕易說「沒有錯誤訊息」這種事情了... [嘆氣] 10/29 13:43
→ kanandg1:板友都有超直覺XD (誤 10/29 13:50
抱歉改掉分隔線了
我的 News 只有幾個 private 欄位 跟Get 的 Method
我想我在去找找其他地方好了
所以 Out of Memory 太多次
JVM就會強制關閉我的程式嗎?
我可能沒搞懂 我以為Thread造成的 Exception 有處理的話
主程式還是不會自動結束 所以我說主程式沒有錯誤訊息 > <
※ 編輯: icecastleo 來自: 218.167.7.129 (10/29 14:04)
→ kanandg1:您有處理OutOfMemoryError的話,程式是不應直接結束沒錯 10/29 14:37
→ adrianshum:樓上: 正常來說 OutOfMemoryError 不該也沒法處理 10/29 14:53
→ kanandg1:我比較相信是一般人不會去處理這個^^" 10/29 15:05
→ jej:以前用hibernate作過累似的事情.. 要insert1000萬筆資料... 10/29 20:47
→ jej:分公司的交易.. 一筆一筆作就等著outofmemory.. 兩種作法.... 10/29 20:50
→ jej:交易許可..夜間資源專門執行程式.. 或給db作trigger.... 10/29 20:52
→ jej:交易不許可..就只好用thread.join來硬作..不過不建議.. 10/29 20:54
→ MonyemLi:我覺得問題在你的list清單吧。thread沒結束沒辦法gc阿 10/30 11:39
→ MonyemLi:list小一點,多執行幾次。thread結束再喚起。或是用pool 10/30 11:41
→ icecastleo:噢可能我沒有用 Thread Pool 讓 Thread 重複利用 QQ 10/30 13:18