1

以下のコードでは、Provider オブジェクトには DbConnection のインスタンスが 1 つしかありません。各リーダーは、同じ接続インスタンスを参照します。Microsoft のドキュメントによると、2 番目のリーダーは接続プールから 2 番目の接続を取得します。これは正しく動作します。

using (var reader1 as IDataReader = Provider.GetReader(sqlStatement1))
{
    while(reader1.Read())
    {
        using (var reader2 as IDataReader = Provider.GetReader(sqlStatement2))
        {
            while(reader2.Read())
            {
            //Do stuff with both statements
            }
        }
    }
}

Provider オブジェクトを使用している限り、接続を開いたままにしたいと思います。ただし、接続プールで接続を無駄にしたくありません。Provider.DbConnection.Close() を呼び出すと、両方の接続がプールに返されますか? もしそうなら、どうすれば2番目の接続を接続プールに戻すことができますか?

4

2 に答える 2

0

さまざまな接続プロバイダーをテストした後、私は自分の答えを見つけました。

OleDbプロバイダーは、SqlClientプロバイダーとは異なる接続プールを維持します。通常、SqlClientプロバイダーは、データベースに接続するたびに新しいSqlConnectionオブジェクトを作成する必要があります。接続を閉じるか、破棄する必要があります。これにより、基になる接続がプールに解放されます。

ただし、OleDbプロバイダーの処理は異なります。毎回新しい接続をインスタンス化する代わりに、アプリケーションの最後に同じ接続オブジェクトを使用して破棄する必要があります。SqlClient接続と同じ方法で使用すると、エラーが「不特定のエラー」としてスローされます。各OleDbCommandには、同じOleDbConnectionインスタンスを割り当てることができます。すでに使用されている場合は、基盤となるプロバイダーが新しい接続を割り当てます。SqlClientプロバイダーでこれを行うと、例外が生成されます。

私の元の接続文字列は次のとおりです。データソース=....mdb; Provider = Microsoft.Jet.OLEDB.4.0; これは128回の接続後に失敗することが判明しました...非常にフレンドリーな「不特定のエラー」があります。接続プール(エラーではない)を調査した後、接続プールをオンにするには、このパラメーターを追加する必要がありました。OLEDBサービス=-1;

これをオンにすると、接続は期待どおりに動作し、制限に達しませんでした。

于 2010-07-28T02:38:35.203 に答える
0

正直に言って、一度に2つのオープンリーダーが必要ないようにリファクタリングを試みます。実際に読み取るのにかかる時間よりも長くリソースを保持することで、データベースでデッドロックが発生する可能性を高めることができます。

これは、SELECT 1 + Nと呼ばれることもある問題です。最初の選択で返された行ごとに、追加の選択を実行しています。これを修正するにはリファクタリングが必要ですが、それはすべて、読み取ろうとしているデータの種類によって異なります。

于 2010-07-27T16:40:45.537 に答える