asp.net webservice OnUnload?

时间:2011-02-13 11:43:39

标签: asp.net web-services dispose sqlconnection

我正在创建一个Web服务,它有许多方法,所有这些方法都使用了SqlConnection。似乎合乎逻辑的是,我将声明一个类级别连接并在Web服务构造函数中初始化它。

问题是,当Web服务调用完成时,我无法找到释放连接的确定方法,因此我有连接泄漏。我已经尝试重写了Dipose()方法,但它没有在合理的时间范围内调用(实际上在我的测试中根本没有)。为了更好的衡量,我还尝试将处理程序附加到Disposed()事件,但正如预期的那样相同的问题。

Web服务类的Page.OnUnload是否有类似内容?似乎很难相信我必须在每个单独的方法中建立单独的连接。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

  

我会声明一个类级别的连接并在Web服务构造函数中初始化它似乎是合乎逻辑的。

不,这似乎没有逻辑。 ADO.NET使用connection pooling,因此您无需执行此操作。此连接池是每个应用程序域的每个连接字符串。

因此,您可以在每个Web方法中从池中绘制一个新连接,并在最后将其返回到池中(using语句将处理此问题):

[WebMethod]
public void Foo()
{
    // Here you are NOT creating a new connection to the database
    // you are just drawing one from the connection pool
    using (var conn = new SqlConnection(SomeConnectionString))
    using (var cmd = conn.CreateCommand())
    {
        // Here you are NOT opening a new connection to the database
        conn.Open();
        cmd.CommandText = "SELECT id FROM foo";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                // do something with the results
            }
        }
    } // Here you are NOT closing the connection, you are just returning it to the pool
}

所以这里有一个建议:不要尝试通过使用一些类字段,静态字段来手动管理连接......将此管理保留给ADO.NET,因为它可以做得更好。

备注:我所显示的代码通常驻留在由Web方法调用的数据访问层中。