0

DBから読み取られる各フィールドのスレッドを作成するJavaプログラムがあります。私はたくさんのフィールドを持っています (+10,000)。私はかなりの遅さに問題がありました。それに加えて、プログラムは最後に無限ループに入ります。つまり、決して終了しないスレッドが 1 つ以上あり、ループが無限になります。次のステートメントのように、読み取る項目の番号 (PK) を指定することで、プログラムが Java コード内から読み取るフィールドの数を減らそうとしました。

"select hName from schema.table where 
ID between 1 AND 200";

この変更後、プログラムは正常に動作します。そのような問題を解決するために何をすべきかを知る必要があります。(where) のような条件を含むステートメントは、Java プログラムのパフォーマンスに影響しますか? 順序または条件を指定しなかったが、テーブルに主キーがある場合、条件なしでステートメントを作成する方が良いオプションですか?

他のクラスにはいくつかの挿入ステートメントがあります。同じレコード番号を持つ 2 つのスレッドを避けるために、そこでステートメントを同期します。

synchronized (this) {
            Query = " insert into schema.table values (default,?,?,?)";
            Stmt = DBConnection.con.Statement(Query);
        } 

メイン関数の関連するコードは次のとおりです。

try {
    ExecutorService threadExecutor = Executors.newFixedThreadPool(10);

    while (resultSet.next()) {
        name = resultSet.getString("hName");
        MyRunnable worker = new Myrunnable(name);
        threadExecutor.execute(worker);
        Counter++;
    }

    //This never appears
    System.out.println("End while with counter" + Counter);

    threadExecutor.shutdown();
    System.out.println("thread shutdown"); //this never appears

    // Wait until all threads are finish
    while (!threadExecutor.isTerminated()) {
        threadExecutor.awaitTermination(1, TimeUnit.SECONDS);
        System.out.println("inside the thread termination loop."); //I have infinite loop

    }

    System.out.println("Finished all threads"); //never appears

} catch (Exception e) {
    e.printStackTrace();
}

System.out.println("END MAIN");

DBConnection.con.close();

runnable を実装するクラスは次のとおりです。

//The constructor
String threadName=null;
MyRunnable (String name)  {
    threadName=name;
}

public void run() {
    myclass Obj=new myclass();
    try {
        Obj.myFunction(name);
    } catch (Exception e) {
        System.out.println("Got an Exception: "+e.getMessage());
    }
    System.out.println(" thread exiting" + threadName);
}
4

2 に答える 2

2

Q: DB から読み取られるフィールドごとにスレッドを作成する Java プログラムがあります。私はたくさんのフィールドを持っています (+10,000)

危険だ、ウィル・ロビンソン!

設計段階で誰かが提案しましたか...それはクレイジーですか? そうしないでください:)

Q: (where) などの条件を含むステートメントは、Java プログラムのパフォーマンスに影響しますか?

A: 「通常、"where" 句を含む SQL クエリは、テーブル全体の単純なダンプよりも優れたパフォーマンスを発揮しますか?」という質問ですか?

もしそうなら:はい、「where」句はクエリのパフォーマンスを向上させることが知られています:)

于 2012-07-25T19:23:27.857 に答える
1

追加の事実にとらわれずに、何らかの理由で 10,000 のスレッドを作成する理由が想像できません。数十のコアを備えたサーバーでも、コンテキストの切り替えはあなたを殺します. あなたのコードはどのように実行されていますか? PC上で実行されている単純なJavaプログラムでは? サーバーで?サーバー上で実行している場合は、アプリケーション サーバーの使用を検討する必要があります。次に、いくつかのことを利用します。まず、スレッドのすべての使用を取り除き、アプリケーションサーバーに依存してリクエストを論理コンポーネントにスケーリングできます(おそらくEJB3コンポーネントを使用します-これを確認することをお勧めします). . 次に、接続プーリングを利用できます。データベースへの接続を作成することは、費用のかかる提案です。プール内で接続を使用する場合、アプリケーション サーバーがすべての接続の管理を処理します。

最後に、テーブルに適切なインデックスがあることを確認してください。たとえば、ID が索引付けされているとします。そうですか?Explain Plan を実行し、クエリに答えるためにスキャンされているテーブルの行数を確認します (Explain Plan 機能の使用方法については、MySQL のドキュメントを参照してください)。

于 2012-07-26T01:22:36.810 に答える