6

ベータ テスト中に、接続プーリングのエラー メッセージが発見されました。したがって、私はコードを調べて、SqlDataReader オブジェクトが閉じられていない場所はどこでも閉じています。私が知る必要があるのは、SqlDataSource または ObjectDataSource タグの SelectStatement 属性で指定されているデータリーダーを閉じる方法 (または閉じる必要がある場合) です。それらが処理されない場合、接続リークが発生する可能性はありますか?

前もって感謝します !

4

7 に答える 7

12

特にデータベースへの接続を開いたり閉じたりする場合は、「using」キーワードを使用する傾向があります。"using" は、Dispose パターンへのショートカットです。ここには MSDN の記事へのリンクがあり、ここには概要が記載された便利なブログ エントリへのリンクがあります。

于 2008-10-20T18:48:17.530 に答える
4

Close()/Dispose() のパフォーマンスを向上させるには、リーダーを破棄または閉じる前に、関連付けられたコマンド オブジェクトで Cancel() を呼び出すことを検討してください。特に、レコード セットの最後に達していない場合はそうです。

例えば:

            using (var cmd = ... ))
            {
                using (var reader = (DbDataReader) cmd.ExecuteReader())
                {
                    try
                    {
                        ConsumeData(reader); // may throw
                    }
                    catch(Exception)
                    {
                        cmd.Cancel();
                        throw;
                    }
                }
            }
于 2009-10-17T08:05:27.183 に答える
2

ここでも、実稼働環境で同じ問題が発生しました。

問題を解決しました。最初の問題は、私のコードにusingステートメントがまったくないことでした。(それは数年前に構築されましたが、知識は少し少なくなっています)。

次に、SqlDataSourceをusing句に入れてみました。しかし、これも役に立ちませんでした。

ここでの秘訣は、tvanfossonとMischaが提案しているように、読者をusing句に入れることです。これは、実際に接続を閉じるオブジェクトです。

接続の数は、中程度の負荷で最小プールサイズの10に縮小されました。

于 2011-01-18T16:37:12.367 に答える
2

SqlDataSourceでは、接続管理が自動的に行われ、何も恐れることはないと理解しています。

ObjectDataSourceそもそもデータベースと直接対話しないため、基礎となるオブジェクトが接続とリーダー管理を正しく実行している限り、安全です。

他の人が述べたように、Close()usingは で使用するクラスの友達ですObjectDataSource

私の推測では、コードベースを効果的にスクラブした場合は、おそらく問題を根絶したことになります。

于 2008-10-20T18:57:49.540 に答える
0

.Dispose() を呼び出すと、クリーンアップが処理され、保持されているリソースが解放されますが、オブジェクトがリーダーからの読み取りを完了すると、.Close() メソッドも呼び出される必要があります

于 2008-10-20T18:51:56.337 に答える
0

SqlDataSource が独自の接続/リーダーの問題を処理すると信じているので、心配する必要はありません。手動接続に関しては、過去にこのパターンが役立つことがわかりました。

   using (SqlConnection connection = new SqlConnection(connectionString))
   {
      try
      {
         SqlCommand command = connection.CreateCommand();
         command.CommandText = ...

         connection.Open();
         using (SqlDataReader reader = command.ExecuteReader())
         {
            do
            {
               while (reader.Read())
               {
                  ... handle each row ...
               }
            } while (reader.NextResult());
         }
      }
      catch (Exception ex)
      {
          ... error handling ...
      }
      finally
      {
         if (connection != null && connection.State == ConnectionState.Open)
         {
            connection.Close();
         }
      }
  }
于 2008-10-20T21:39:30.820 に答える
-1

ObjectDataSourceの場合、クロージングは​​Selectメソッドで処理する必要があることに同意します。My ObjectDataSource Selectメソッドは、SqlDataReaderを返します。私の懸念は...それをUIに戻した後に閉じたときにSqlDataReaderが役に立たなくなるのでしょうか。たとえば、次のサンプルコードを参照してください。私はそれを試したことがなく、開発のこの段階ではやりたくありません。

SqlDataReader MySelectMethod(){
   SqlDataReader dr = null;
   try{
      dr = DBObject.GetDataReader();
      return dr;
   }
   finally{
      dr.Close();
   }
}

これまでに受け取ったすべての入力に感謝します!

..........。

私の理解では、SqlDataSourceを使用すると、接続管理が自動的に実行され、心配する必要はありません。

ObjectDataSourceは、そもそもデータベースと直接通信しないため、基盤となるオブジェクトが接続とリーダー管理を正しく実行している限り、安全です。

他の人が述べているように、Close()とusingは、ObjectDataSourceで使用するクラスの友達です。

于 2008-10-21T00:21:10.150 に答える