-1

テキストファイルから読み取るTCAPフレームをデコードし、デコードしたデータをデータベース(Oracle)に挿入するJavaアプリケーションをコーディングしています! そのため、最初はデコードと統合が完全に実行されますが、デコードおよび挿入されたデータの有限数に達すると、データベースへの挿入を想定しているスレッドでこのエラーがトリガーされ始めます。

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

この問題を解決するアイデアはありますか?

4

2 に答える 2

2

挿入ごとにスレッドをインスタンス化する(または他のアクションを実行する)代わりに、「タスク」のキューを作成してみてください。各タスクは、そのようなスレッドが実行する必要のある挿入を表します。このようなキューがある場合は、タスクをキューに「プッシュ」するスレッドと、実際のタスクをキューから「プル」して実行することで実際のタスクを実行するスレッドが必要です。このように作業することで、タスクごとにスレッドは必要ありませんが、代わりに、キューからタスクを取得して実行し、キューに戻ってさらに作業を行う汎用スレッドの小さなセットを使用できます。

psスレッドを再利用するときは、runメソッドで接続を作成しないでください。毎回、接続を再作成する必要はありません。

エグゼキュータとスレッドプールについて読むプロデューサーコンシューマー
を 参照DB接続プール を参照

于 2013-03-13T14:13:11.310 に答える
0

trheadの冒頭にこのステートメントがあります

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

新しいスレッドが作成されるたびに、新しい接続を作成しているようです。接続を作成してからステートメントを実行するには時間がかかるため、最初の接続が閉じられるまでに、他の多くの接続が作成されているため、これ以上作成できません。

接続に静的参照を1つ使用する場合は、より適切なオプションになります。

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

すべてのスレッドの実行が完了したら、接続を閉じます。

于 2013-03-13T14:14:50.020 に答える