簡體   English   中英

NullPointerException,在線程上

[英]NullPointerException, at thread

我正在編碼Java應用程序,該程序解碼將從文本文件讀取的TCAP幀,然后將解碼后的數據插入數據庫(Oracle)中! 因此,一開始,解碼和集成是完美執行的,但是當解碼和插入的數據達到一定數量時,它將開始在假定要插入數據庫的線程中觸發此錯誤:

   " 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); 
    }
} 

有誰有解決這個問題的想法?

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

ps當您重用線程時,不必在run方法中創建連接,也不必每次都重新創建連接。

了解執行器和線程池
查看生產者消費者
請參閱數據庫連接池

您在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();
} 

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM