2012-03-23 1 views
0

これはこれまでに起こったことではなかったので、私はこれを引き起こしていると仮定していますが、それが何であるかはわかりません。Linq2Sqlがsproc呼び出しごとに新しい接続を作成し、それを開いたままにしているのはなぜですか?

SQL Server 2005データベースに対してlinq2sqlを設定しました。私はストアドプロシージャを使用しています。

私の手順の大半はうまくいきますが、この1つの特定のアップデートプロシージャは、数百回も連続して(ヘッダレコードの詳細のクローン作成)実行されることがあります。

これはタイムアウトの原因となり、開いている接続を確認するスクリプトを実行すると、すべてのスリープ状態とスペースを占有していることがわかります。

どのようなご意見、アドバイスですか?

私のDataContextは、サービスクラスの静的変数として設定され:

private static WarehouseSystemDataContext dc 
{ 
    get 
    { 
     // It is being passed a closed SqlConnection object 
     WarehouseSystemDataContext _dc = 
      new WarehouseSystemDataContext(Constants.getWarehouseSystemConn()); 
     _dc.ObjectTrackingEnabled = false; 
     _dc.CommandTimeout = 600; 

     return _dc; 
    } 
} 
+0

を参照されるたびに作成している私は、それはあなたのことは言うまでもない仮定'using'ブロックで' dc'の消費者を常に囲みますか? ( '(foo.dc){...}'を使用して) –

+0

私は通常ではありません。私の以前の理解は、linq2sqlがあなたのための接続のオープンとクローズを管理することでした。この問題のために、私は使用ブロックを追加しましたが、まだ運がありません。 – IronicMuffin

+0

linq2sqlは状態を適切に管理することがあり、時には状態を管理しないことがあります。結果セットを完全に反復処理すると、最後に結果セットが閉じられます。私は '.Single'を使うときにはそうでないことを発見しました。つまり、GC接続時に接続は処分されますが、後で問題が発生することがあります。 –

答えて

3

あなたは、新しい接続にDataContextのが

private static WarehouseSystemDataContext _dc 
private static WarehouseSystemDataContext dc 
{ 
    get 
    { 
     if(_dc == null) 
     { 
     // It is being passed a closed SqlConnection object 
     _dc = new WarehouseSystemDataContext(Constants.getWarehouseSystemConn()); 
     _dc.ObjectTrackingEnabled = false; 
     _dc.CommandTimeout = 600; 
     } 
     return _dc; 

    } 
} 
+0

なぜですか?静的なので、毎回同じDataContextを使用していませんか?それはおそらくそれが自分の接続を管理していますか?完了したら閉じてはいけませんか? – IronicMuffin

+0

@IronicMuffin、あなたの質問では、インスタンスは静的ではありません、ここには –

+0

あなたは間違いがあります。あなたの設定とusingステートメントを使用して、私は今ObjectDisposedExceptionを取得します... – IronicMuffin

関連する問題