C# Nhibernate和会话池

C# Nhibernate和会话池,c#,entity-framework,session,nhibernate,C#,Entity Framework,Session,Nhibernate,我正在做一个项目,在这个项目中,每1秒应该向表中插入一个新的消息。在EntityFramework中,有一种称为连接池的方法,它使上下文的生存期尽可能短成为更好的选择。这是否适用于Nhibernate会话 ISessionFactory sf = cfg.BuildSessionFactory(); ISession session = sf.OpenSession(); While(true) { //....... using (var tran = session.BeginTra

我正在做一个项目,在这个项目中,每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);
}


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

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

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

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

不仅仅是回答:

除了短时会话外,还应考虑执行<代码> UNITWorks<代码>(“每次会话会话”,即正确使用事务和会话)来提高一级缓存和批处理的好处。

第一级缓存为每个会话。如果在新会话上运行每个DB调用,实际上并没有获得缓存优势

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

参考并提问


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

可能重复的答案值得查看
SessionFactory
界面上的
OpenStatelessSession
方法。无状态会话概念似乎非常适合您所做的工作。谢谢!这对我帮助很大。但在我的例子中,源数据是从物理设备获取的,该设备每秒生成一个数据块。因此,如果我像你说的那样进行批处理,会话需要存活500秒才能提交和处置,这可能违反第一条规则;在这种情况下,批处理对您没有任何帮助。
ISessionFactory sf = cfg.BuildSessionFactory();
While(true)
{
//.......
    using(var session = sf.OpenSession())
    {
     using (var tran = session.BeginTransaction())
     {
         session.SaveOrUpdate(msg);
         tran.Commit();                           
     }
     Thread.Sleep(1000);
    }
}