3

Connection クラスのクラス メソッドから接続を返しています。別のクラスでは、接続クラスをインスタンス化して接続を開きます。接続も閉じましたが、接続リークがあるようです。どうすれば修正できるか考えてみてください。以下の私のコード

public class Connection
{
    private SqlConnection _oConn;

    public SqlConnection GetConnection
    {
        get
        {
            if (_oConn == null)
            {
            string sConnString = ConfigurationManager.ConnectionStrings["bplocator_database_connection"].ConnectionString;

                _oConn = new SqlConnection(sConnString);

            }
            return _oConn;
        }          
    }         
}

別のクラス ファイルで、この接続クラスを呼び出します

 private BPAdmin.data.Connection oConn
    {
        get
        {
            if (_oConn == null)
            {
              _oConn = new BPAdmin.data.Connection();
            }
            return _oConn;
        }
    }

public void getData
 {
    try
   {
        oConn.GetConnection.Open();
      //Do something
    }

   catch
      {
          oConn.GetConnection.Close();
      }
   finally
      {
          oConn.GetConnection.Close();
      }
 }

これにより接続リークが発生し、アプリケーションプールが最大に達したことがわかりました。何が問題なのか、どうすれば修正できるのか。助けてください!。

4

3 に答える 3

3

2 つのオプションがあります

  1. 使用using ステートメント
  2. 呼び出しfinallyの代わりにCloseDispose

どちらのソリューションでも問題は解決するはずです。

UPDATE : using ステートメントの使用方法

oConn常に新しいオブジェクトを返すため、getData次を使用できます。

 public void getData()
 {
   try
   {
       using(var conection=oConn.GetConnection)
       {
             //execute your query
       }

    }
    catch
    {
          //do something to show user an error or just log it
    }
    finally
    {
         //you do not have to close connection because using statement will do this for you
    }
 }
于 2013-09-10T04:11:02.157 に答える
0

SqlConnectionは使い捨てクラスなので、使い終わったら破棄する必要があります。

要するに、クラス自体に実装してもらいますIDisposable(そこにある例に従ってください。かなり教科書的です)。

于 2013-09-10T04:07:20.553 に答える
0
   catch
      {
          oConn.GetConnection.Close();
      }
   finally
      {
          oConn.GetConnection.Close();
      }

この部分を見て、最終的にはtry catchブロックで何が起こっても起こるので、削除してください

catch
  {
      oConn.GetConnection.Close();
  }

あなたのコードから

于 2013-09-10T04:10:07.160 に答える