3

読み取り専用データベース操作を複数のチャンクに分割しています (それぞれが非常に大量のデータのサブセットを読み取り、それを分析し、結果をディスク ファイルに書き込みます)。

各チャンクは、(デリゲートと BeginInvoke を使用して) 新しい .net スレッドで (データテーブルへの) Select を実行します。

プール内の使用可能な接続よりも多くのデータのサブセットがあるため、接続が不足すると、最初の接続が解放される前に、後続の接続要求がキューに入れられます...接続タイムアウトが期限切れになるまで、タイムアウト例外。

A) プール内の接続がすべて使用中の場合にタイムアウト接続の例外を禁止する方法、または B) 別の接続を要求する前にそれらがすべて使用中であることを検出して、要求する前に接続が使用可能になるまで待機できるようにする方法?

4

1 に答える 1

1

2 つのソリューション:

A) 数日のタイムアウトで接続プールを構成します。これにより、接続が返されるまで保留中のタスクがブロックされます。欠点: タスクがハングアップすると、これは機能しません。

B) スレッド プールとワーク キューを使用します。スレッド プールは、接続プールと同じサイズ (つまり、スレッドごとに 1 つの接続) である必要があります。すべての作業をキューに入れ、キューが空になるまでタスクにキューから作業項目をフェッチさせます。

ソリューション B の疑似コード:

public class Setup
    connPool = createConnectionPool(100);
    queue = createWorkQueue();
    putAllWorkItemsInQueue(queue);
    for (int i=0; i<connPool.size(); i++) {
        t = new WorkerThread(queue)
        list.add(t);
        t.start();
    }
    while (queue.size() != 0) {
        Thread.sleep(1000);
    }
    for (thread in list) {
        thread.interrupt();
    }

public class WorkerThread
    run() {
        while (true) {
            try {
                workUnit = queue.get(); // This blocks
                process(workUnit);
            } catch (InterruptedException e) {
                break;
            }
        }
    }
于 2008-12-02T14:50:32.267 に答える