流量Nhibernate内存泄漏附加堆转储

时间:2014-12-03 15:57:26

标签: c# caching nhibernate fluent-nhibernate

我知道2008年发布的查询缓存存在以前的Nhibernate问题。我使用的是Fluent NHibernate 1.4.0和NHibernate 3.3.1。我正在运行一个同步程序,该程序从多个会话打开并创建多个查询,因为我正在处理大型数据集。我使用终止的所有数据结构通常都是有限长度的。我从CLRProfiler工具中获得的是SessionFactoryImpl类正在变大。

这是应用程序的内存堆转储

转到https://app.box.com/s/pvbe9ryfb0v168rka2e3的链接以查看内存堆转储。

我在整个应用程序中使用无状态会话,并且我正在使用块包装所有内容。我已将Session Factory创建者设置为以下行

return Fluently.Configure().Database(cfg).Mappings(m => {
            var fluentMappings = m.FluentMappings;

            fluentMappings.Add<UCBPremMap>();
            fluentMappings.Add<UTVSSFXMap>();
        }).Cache(c => {
            c.Not.UseQueryCache();
            c.Not.UseSecondLevelCache();
        }).BuildSessionFactory();

但我想从我对堆图的解释来看,NHibernate缓存数据结构一直在增长,直到我的内存不足为止。

当尝试解析另一个表达式树时,通常会发生堆栈溢出(我试图最小化数据库调用,有时我只能按内容搜索字段,这会创建一个包含1000个单独where子句的表达式树)。

任何帮助将不胜感激。我的同事,在另一个程序上,也注意到他的程序遇到OutOfMemory异常,这也表明NHibernate中存在内存泄漏。

1 个答案:

答案 0 :(得分:0)

这是我发布到Google网上论坛的帖子。 https://groups.google.com/forum/#!topic/nhusers/LDYlxhUPZuo

我已经使用反射来解决问题,以访问QueryPlanCache中的planCache字段,并将Hashtable设置为内容大小从128到8。