1

を使用して独立したタスクを並列に実行しようとしていjava.util.concurrent.Executorます。

次の作業コードがあります

public class MiniTest {

    private static String[] input;
        static {
            input = new String[] { 
                    "task1", 
                    "task2",
                    "task3",
                    "task4"
                };
        }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        boolean atleastOnePoolStarted = false;
        for (int i = 0; i < input.length; i++) {
            Runnable worker = new WorkerThread(input[i] + i);
            executor.execute(worker);
        }
        executor.shutdown();
        executor.awaitTermination(15,TimeUnit.MINUTES);
        System.out.println("Finished all threads");
    }
}

これは正常に機能しており、並列実行が見られます。

しかし、問題は、データベースに接続してストアドプロシージャ呼び出しを実行するWorkerThread他のクラスに置き換えるときです。Runnableその場合、スレッドは開始されていますが、ストアド プロシージャへの実際の呼び出しは手続き的な方法で行われているようです。つまり、2 番目の java-proc 呼び出しは、最初の呼び出しが終了するまで実行されません。

データベース部分は、独立して検証およびテストされているため、正常に機能しています。同時に 2 ~ 3 件の通話を開始する必要があります。データベースとして Sybase を使用しています。

以前にこの問題に遭遇した人はいますか? 何が間違っている可能性があるか教えてください。

4

1 に答える 1

1

何が間違っているのかについてのいくつかのアイデア:

  • 接続を 1 つだけ開く場合があります (数年前に使用したとき、Sybase クライアントはマルチスレッド対応ではありませんでした)。
  • ストアド プロシージャは、2 番目の呼び出しを待機させてブロックさせるテーブルをロックします。SP は、最初のどこかでテーブルに対して何らかの挿入、更新、削除を行いますか? 多分トランザクションの中で?さて、2 番目の SP は最初の SP が終了するのを待ちます。
  • Sybase での長い間の 1 つの問題は、一部のシステム テーブルを排他的にロックし、2 番目の SP が最初の SP が作成を完了するまで待機させるオブジェクト (テーブル、列、ビュー、一時テーブルなど) を作成することでした。それがまだ起こる可能性がある場合は、誰かがアドバイスできるかもしれません。
于 2013-09-18T14:45:25.077 に答える