我正在使用Nhibernate连接到Oracle 11g数据库。数据库管理员让我看看程序,因为有很多非活动会话被打开,显然这很快就会使服务器崩溃。
为什么Nhibernate没有关闭连接?以下是代码示例:
public void Foo()
{
using (_sessionFactory = _Configuration.BuildSessionFactory())
using (_session = _sessionFactory.OpenSession())
{
_session.Transaction.Begin();
//DO STUFF
_session.Transcation.Commit();
}
}
我的印象是处理会话和sessionFactory会调用session.Close()并且连接将被关闭。
这只是连接池做它的工作吗?如果是这样,我可以设置连接池的最大大小?想要流利的Nhibernate吗?
答案 0 :(得分:1)
查看代码,似乎您的代码允许创建多个会话工厂实例,最佳做法是只创建一个会话工厂。
当您使用连接池时,会为每个会话工厂创建一个连接池,这似乎会导致连接处于非活动状态。
答案 1 :(得分:0)
似乎问题是由交易的使用引起的。从上面的代码中删除事务产生了以下内容:
public class DoSomethingToDb(ISessionFactory sessionFactory)
{
using (_sessionFactory = _Configuration.BuildSessionFactory())
using (ISession session = sessionFactory.OpenSession())
{
//Do Stuff
session.Flush();
}
}
这似乎没有引起任何问题。
然而,正如@LowFlyingPelican建议的那样,我已经将会话工厂的创建更改为在应用启动时发生。