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

你有两个选择

  1. 使用using 声明
  2. finally而不是Close调用Dispose

两种解决方案都应该解决问题。

更新:如何使用 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 回答