C# - 从类方法返回的连接泄漏

时间:2013-09-10 04:00:49

标签: c# asp.net

我已从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();
      }
 }

我发现这导致连接泄漏并导致应用程序池达到最大值。任何想法是错的,我如何解决它。请帮忙!

3 个答案:

答案 0 :(得分:3)

您有两个选择

  1. 使用using声明
  2. finally而不是Close致电Dispose
  3. 两种解决方案都应该解决问题。

    更新:如何使用声明

    由于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
        }
     }
    

答案 1 :(得分:0)

SqlConnection是一个一次性课程,你应该在完成后处理它。

简而言之,让你的班级自己实施IDisposable(按照那里的例子。这是非常好的教科书)。

答案 2 :(得分:0)

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

看一下这部分,最后会发生在try catch块中发生的事情,所以删除

catch
  {
      oConn.GetConnection.Close();
  }

来自您的代码