我的公司有一个ASP.Net应用程序,在我们的客户进行了几天的活动后,内存不足并导致内存不足。我能够在测试环境中重现错误,并使用adplus创建了一个挂起转储。在查看堆上最大/最多的对象时,我注意到我们有超过500,000个NHibernate.SqlCommand.Parameter对象。这不可能是正确的!我们实例化了33个sessionfactories,每个客户端数据库有1个sessionfactory。我们使用的nhibernate版本是2.1.0.4000。
我们已禁用二级缓存,查询计划缓存和查询缓存。我们仍然在内存转储中看到500,000个NHibernate.SqlCommand.Parameter。
有没有人看到过这种行为?
答案 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尝试此操作时,连接泄漏甚至更糟。