2013-03-13 37 views
-1

我正在編碼Java應用程序解碼TCAP幀,它將從文本文件讀取,然後將解碼的數據插入數據庫(Oracle)!所以,在開始解碼和整合是完全執行,但是當它reachs有限解碼,並插入的數據數量,它開始在這個假設插入到數據庫中的線程觸發此錯誤:NullPointerException,在線程

" java.lang.OutOfMemoryError: unable to create new native thread " 
    " Exception in thread "Thread-465" java.lang.NullPointerException " 

碼提取物:

public void run(){ 
    Conn_BD connexion=new Conn_BD("thin:@localhost:1521:XE", "SYSTEM", "SYSTEM");  
    java.sql.Connection cn=connexion.connect(); 
    try { 
     Statement instruction = cn.createStatement(); 
     instruction.executeUpdate("update tcapBegin set "+ 
      trame+"='"+trame_val+"' where "+message+" like '"+trameId+"'"); 
     cn.close(); 
    } catch(SQLException e) { 
     System.out.print(e); 
    } 
} 

有沒有人有想法解決這個問題?

+1

您可以粘貼的任何代碼? – 2013-03-13 13:58:41

+0

代碼會有幫助,但這兩個錯誤消息似乎表明您正在創建太多的線程和空指針(可能是因爲第一個錯誤)。 – Thilo 2013-03-13 13:58:59

+11

你的問題似乎是'OutOfMemoryError'而不是'NullPointerException'。 – Kai 2013-03-13 13:59:07

回答

2

而不是實例化每個插入的線程(或其他任何其他操作),嘗試創建一個「任務」隊列,每個任務將表示這樣的線程應該執行的插入。 當你有這樣一個隊列時,你需要有一個線程將任務「推送」到隊列中,並通過「拉出」隊列並執行它們來執行實際任務的線程。 通過這種方式工作,您不需要每個任務的線程,而是可以使用一小組通用線程,這些線程將從隊列中取出一個任務,執行它並返回到隊列以進行更多的工作。

p.s.當你重用你的線程時,不要在run方法中創建一個連接,你不必每次重新創建連接。

閱讀Executors and Thread Pooling
Producer Consumer
DB Connection pooling

0

您在trhead年初

Conn_BD connexion=new Conn_BD("thin:@localhost:1521:XE", "SYSTEM", "SYSTEM"); 

好像你正在創建一個新的連接,每次一個新線程創建有這個說法。創建連接然後執行語句需要時間,因此在第一次連接關閉的時候,已經創建了許多其他連接,以至於無法再創建它們。

如果您使用一個靜態引用進行連接,則會有更好的選項。

private static Conn_BD connexion=new Conn_BD("thin:@localhost:1521:XE", "SYSTEM", "SYSTEM");  
private static java.sql.Connection cn=connexion.connect(); 
public void run(){ 
Statement instruction = cn.createStatement(); 
//code here 
instruction.close(); 
} 

一旦所有線程都完成,執行關閉連接。

相關問題