Nhibernate和会话池



我正在做一个项目,应该每隔1秒向表中插入一个新消息。在EntityFramework中,有一种叫做连接池的东西,这使它成为尽可能缩短上下文生存期的更好选择。我们处理上下文。这适用于Nhibernate会话吗?

ISessionFactory sf = cfg.BuildSessionFactory();
ISession session = sf.OpenSession();
While(true)
{
//.......
using (var tran = session.BeginTransaction())
{
session.SaveOrUpdate(msg);
tran.Commit();                           
}
Thread.Sleep(1000);
}

ISessionFactory sf = cfg.BuildSessionFactory();
While(true)
{
//.......
using(var session = sf.OpenSession())
{
using (var tran = session.BeginTransaction())
{
session.SaveOrUpdate(msg);
tran.Commit();                           
}
Thread.Sleep(1000);
}
}

两者似乎都有效,但我该用哪一个呢?

好吧,如果我决定只回答你的问题:

第二个代码块更合适。实际上,连接池与NHibernate无关。它是底层RDBMS的行为。

在NHibernate中,创建SessionFactory的成本很高,并且在应用程序生命周期中只应进行一次(理想情况下是在启动时)。创建ISession并不昂贵。建议您的会话应尽可能短。

不仅仅是回答:

除了短叶会话之外,您还应该考虑实现UnitOfWork("每次会话的会话",即正确使用事务和会话),以提高一级缓存和批处理的好处。

一级缓存是按会话设置的。如果在新会话上运行每个DB调用,那么实际上并没有获得缓存优势。

批处理也是如此。批处理是根据您处理事务的方式进行的。对tran.Commit();的调用与其他一些属性(如nhSession.FlushModenhSession.SetBatchSize)一起起着重要作用。请参阅本文
要实现批处理,我建议您改进第一个代码块,而不是在using块中提交事务,而是在循环的每100次迭代(或10或500次适合您的迭代)中执行。

请参阅此问题和此问题。

参考@Fran在评论中所说的答案。

最新更新