我知道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中存在内存泄漏。
答案 0 :(得分:0)
这是我发布到Google网上论坛的帖子。 https://groups.google.com/forum/#!topic/nhusers/LDYlxhUPZuo
我已经使用反射来解决问题,以访问QueryPlanCache中的planCache字段,并将Hashtable设置为内容大小从128到8。