【发布时间】:2011-02-10 18:47:20
【问题描述】:
我将我的 linq to sql 调用封装在一个存储库类中,该存储库类在我的重载控制器的构造函数中实例化。我的存储库类的构造函数创建数据上下文,因此在页面加载的整个生命周期中,只使用一个数据上下文。
在我的存储库类的析构函数中,我明确调用了 DataContext 的 dispose,尽管我不认为这是必要的。
使用性能监视器,如果我观察我的用户连接计数并重复加载页面,则每次加载页面时该数量都会增加一次。连接不会关闭或重复使用(大约 20 分钟)。
我尝试将 Pooling=false 放入我的配置中以查看这是否有任何效果,但它没有。在任何使用池的情况下,我都不希望每次负载都有一个新连接,我希望它能够重用连接。
我已经尝试在析构函数中放置一个断点,以确保 dispose 被命中并且确实如此。那么发生了什么?
一些代码来说明我上面所说的:
控制器:
public class MyController : Controller
{
protected MyRepository rep;
public MyController ()
{
rep = new MyRepository();
}
}
存储库:
public class MyRepository
{
protected MyDataContext dc;
public MyRepository()
{
dc = getDC();
}
~MyRepository()
{
if (dc != null)
{
//if (dc.Connection.State != System.Data.ConnectionState.Closed)
//{
// dc.Connection.Close();
//}
dc.Dispose();
}
}
// etc
}
注意:我向 DC 添加了一些提示和上下文信息以用于审计目的。这就是为什么我希望每个页面加载一个连接
更新: 在我的存储库和我的控制器类上实现 IDisposable 后,我找不到一种方法来专门调用我的控制器上的 Dispose 方法,因为控制器是由 MvcHandler 在幕后创建和销毁的。但是我确实发现我的连接无论如何都被关闭了。知道这行得通但不知道为什么我感到不舒服,所以我进行了一些挖掘并找到了一个让我高兴的 MSDN 报价:
执行完成后,MvcHandler会检查控制器是否实现了IDisposable接口,如果是,会调用控制器上的Dispose来清理非托管资源。
最终更新: 经过一个月左右的工作后,我现在已经删除了所有这些代码,并遵循了 MS 建议的路线,即在我的公共存储库方法中围绕代码包装“使用”语句并将这个 DC 传递给私有方法。这似乎有点浪费和重复,并导致更多的连接被打开和关闭。但是我得到了 linq to sql 缓存,我只能通过重置 DC 来解决。
【问题讨论】:
标签: c# asp.net-mvc linq-to-sql