首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IoC to SQL DataContext Windsor Linq内存泄漏问题

IoC to SQL DataContext Windsor Linq内存泄漏问题
EN

Stack Overflow用户
提问于 2009-11-11 04:32:55
回答 4查看 1.6K关注 0票数 4

我有一个Castler MVC应用程序,它使用Castler Windsor IoC在每个web请求的基础上创建Linq2SQL数据上下文。

出于某些我不能完全理解的原因,每次创建新的数据上下文(针对每个web请求)时,都会占用大约8k的内存,而不是释放--这不可避免地会导致OutOfMemory异常。

如果我强制垃圾回收,内存释放正常。

我的datacontext类非常简单:

代码语言:javascript
运行
复制
 public class DataContextAccessor : IDataContextAccessor
 {
    private readonly DataContext dataContext;
    public DataContextAccessor(string connectionString)
    {
        dataContext = new DataContext(connectionString);           
    }
    public DataContext DataContext { get { return dataContext; } }
 }

用于实例化它的Windsor IoC webconfig如下所示:

代码语言:javascript
运行
复制
 <component id="DataContextAccessor"
             service="DomainModel.Repositories.IDataContextAccessor, DomainModel"
             type="DomainModel.Repositories.DataContextAccessor, DomainModel"
             lifestyle="PerWebRequest">       
    <parameters>
      <connectionString>
        ...
      </connectionString>
    </parameters>
  </component>

有谁知道问题是什么,以及如何解决它吗?

EN

回答 4

Stack Overflow用户

发布于 2009-11-11 05:14:39

L2S DataContext实现了IDisposable。您的接口还必须实现它,并调用DataContext.Dispose(),以便Windsor知道有资源需要处理。

顺便说一句,小心Windsor/ By可能出现的问题:http://www.jeremyskinner.co.uk/2008/05/03/aspnet-mvc-controllers-windsor-and-idisposable/ http://www.nablasoft.com/Alkampfer/?p=105

票数 6
EN

Stack Overflow用户

发布于 2010-05-18 18:04:17

不,您的DataContextAccessor不需要实现IDisposable。Windsor足够聪明,可以处理这种情况,而不必对类进行任何修改。

然而,正如在其他答案中指出的那样,DataContext确实实现了它,并且Windsor看到它并注册它以进行清理(以调用它的Dispose方法)。

您需要做的是调用container.Release并传递您的根服务(在本例中可能是DataContextAccessor )。然后,Windsor将释放它和它的所有依赖项(它还将在DataContext上调用Dispose ),内存将被释放。

如果你正在使用Windsor,考虑使用MVCContrib项目,它具有ASP.NET集成,可以为你处理组件的发布。

票数 4
EN

Stack Overflow用户

发布于 2009-11-11 06:28:29

据我所知,queen3是正确的,您的DataContextAccessor类需要实现IDisposable并从其.Dispose()方法调用datacontext.Dispose()。(免责声明:我没有和温莎城堡合作过。)

或者,我要做的是将您的DataContextAccessor转换为一个DataContextFactory,它只在您调用一个方法(例如GetContext())时创建DataContext。然后你可以这样做:

代码语言:javascript
运行
复制
using(DataContext context = myDataContextFactory.GetContext()) {
    // Do whatever you want with the context
}
// Context is disposed here

您可能还想看看前面的这个问题:How do you reconcile IDisposable and IoC?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1710992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档