NHibernate内存泄漏

时间:2010-05-13 22:06:08

标签: asp.net nhibernate memory-leaks

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

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

有没有人看到过这种行为?

1 个答案:

答案 0 :(得分:1)

我们的应用程序存在类似问题(Windows 7上的NHibernate 2.1.2.4000,ODP.net 2.111.7.0)。当我们将数据插入数据库时​​,我们最终会得到一个巨大的内存并处理泄漏:

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()
    }
}

问题的唯一解决方法是在连接字符串中设置Enlist = false或使用OracleClientDriver而不是OracleDataClientDriver。这个问题在NHibernate 1.2中没有发生。当我们使用TransactionScope尝试此操作时,连接泄漏甚至更糟。