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