2012-04-06 11 views
4

私は賢いと思っていました。しかし、最近の発見に照らして、私はそれ以上は確かではありません。ページライフサイクルの間、任意の数のデータベース相互作用によって可能性があります。背中合わせのものもあれば、広がるものもあります。だから、私はHttpContext.Items辞書にSQL接続のインスタンスを生きているオブジェクトを考案しました。すべてのdb要求はこの接続を使用し、http要求が終了すると接続を正しく破棄します。私たちは、接続が開かれる数百ミリ秒を見ています。多量のhttpキャッシュを使用すると、使用可能な接続が不足していることは懸念されません。SqlConnectionとプールは、kung-fooまたはfoo-barを開いたままにしていますか?

新しい接続の確立による追加のラウンドトリップを防止することがポイントでした。しかし、接続プーリングに関する知識が不足していたとき、SqlConnectionを保持することの有用性がかなり無効になったと思います。それとも?

シナリオAはシナリオBと同じですが、パフォーマンスは良いですか?どちらをお勧めしますか?シナリオBはパフォーマンスの向上をもたらさず、接続が適切に処理されない場合があるため、シナリオBはそれを妨げる可能性があります。例の疑似を許して、私はbarfでそれらを混乱させたくありません。

using (var connection = new SqlConnection(connectionString)) 
{ 
    using (var command = new SqlCommand("...", connection)) 
    { 
     ... doing database stuff ... 
    } 
} 

... traversing the stack ... 

using (var connection = new SqlConnection(connectionString)) 
{ 
    using (var command = new SqlCommand("...", connection)) 
    { 
     ... doing database stuff ... 
    } 
} 

B

var connectionKeeper = new ConnectionKeeper(); 

    // Add to the context items so it can be used anywhere 
    Context.Items.Add("Connection", connectionKeeper); 

    ... traversing the stack ... 

    using (var command = new SqlCommand("...", connectionKeeper.Connection)) 
    { 
     ... doing database stuff 
    } 

    ... traversing the stack ... 

    using (var command = new SqlCommand("...", connectionKeeper.Connection)) 
    { 
     ... doing database stuff 
    } 

    ... traversing the stack ... 

    // The end of the request 
    sqlKeeper.Dispose(); 

答えて

7

部Aからあなたのコードを使用して、それが仕事だん接続プールを聞かせてください。静的なままでは避けてください。SqlConnection接続プールはこれ用に設計されています。

ここには参考になるMSDNの記事があります。

SQL Server Connection Pooling (ADO.NET)

+3

合意されたSQLサーバーには接続プール機能が組み込まれていますので、接続を保持することについて心配する必要はありません。プールに魔法をかけましょう。 –

+0

これは私が最近考えたものです。それを確認していただきありがとうございます。 – Levitikon

+1

MSDNがADO.NETプーリングの記事を更新して、これに関する詳細をお伝えしたいと思います。この点について何度も議論しなければならないのは驚くべきことです。プールに仕事をさせてください! – mafue

2

あなたがオフの接続プールを有効にしない限り、コードでそれを行うにはポイントはありません。

そして、それを行う前に真剣に考えなければならない、それは極端な状況です。

この「永続的な」接続で対処しようとしている状況に対処するために接続プーリングが考案されたため、実際には最適化が妨げられ、コードの量、複雑さ、

関連する問題