2010-05-13 229 views
4

我的公司有一个ASP.Net应用程序,它在内存不足的情况下运行,并在客户进行了几天的活动后抛出内存异常。我能够在我们的测试环境中重现错误,并使用adplus创建了挂起转储。当查看堆中最大/最多的对象时,我注意到我们有超过500,000个NHibernate.SqlCommand.Parameter对象。这不可能是正确的!我们有33个sessionfactories实例化了总数,并且每个客户端数据库有1个sessionfactory。我们使用的nhibernate的版本是2.1.0.4000。NHibernate内存泄漏

我们禁用了二级缓存,查询计划缓存和查询缓存。我们仍然在内存转储中看到500,000个NHibernate.SqlCommand.Parameter。

有没有看到这种行为?

+0

您正在使用哪个驱动程序? – 2010-05-14 07:30:13

回答

1

我们也有类似的问题,我们的应用程序(NHibernate的2.1.2.4000,ODP.net 2.111.7.0在Windows 7)。当我们将数据插入到数据库中,我们结束了一个巨大的内存和处理泄漏:

for (int i=1;i<10000;i++) 
{ 
    using (var session = _sessionFactory.OpenSession(); 
    { 
     var tx = session.OpenTransaction() 
     // insert a few rows into one table 
     tx.Commit() 
    } 
} 

的问题唯一的解决方法是设置在连接字符串中争取=虚假或使用OracleClientDriver代替OracleDataClientDriver的。这个问题在NHibernate 1.2中没有发生。当我们用TransactionScope试用这个时,连接泄漏更严重了。