NHibernate中StatelessSession和Session有什么区别?

31

StatelessSessionSession 在 NHibernate 中有什么区别?


请点击此处查看翻译后的文本:这里 - Renatas M.
可能是NHibernate - ISession vs. IStatelessSession的重复问题。 - Owen Pauling
2个回答

26

无状态会话不会跟踪检索到的实体。例如,对于常规 ISession,以下代码:

var session = sessionFactory.OpenSession()
using(var transaction = session.BeginTransaction()){
    var user = session.Get<User>(1);
    user.Name = "changed name";
    transaction.Commit();
}

这将导致数据库中的更新。由于追踪的实体数量增加,这种追踪会消耗内存并降低ISession的性能。

使用IStatelessSession的相同代码不会有任何作用。当您需要加载大量数据并执行一些批处理操作时,可以使用无状态会话。它可用于以更符合“ado.net”风格的方式处理大型数据集。


14
这个答案需要更多关于StatelessSession的细节。你能否提供一个代码示例,演示如何使用StatelessSession更新数据库? - Jess

2

NHibernate中的Session会将所有插入的数据缓存在会话级别的缓存中。

 using (var session = sessionFact.OpenSession())
         {
            using (var trans = session.BeginTransaction())
            {
              for (int  = 0; i < 500000; i++)
              {
                 Student st = new Student(
                 {  
                      ID = 1,
                      FirstName = "Zia",
                      LastName = "Qammar"
                 });

                 session.Save(st);
               }

               trans.Commit();
            }
          }

以上代码在向数据库插入50000个学生时会抛出"OutOfMemoryException"异常。NHibernate提供的另一种方法是StatelessSession,它将数据以分离对象的形式持久化到数据库中。

using (var session = sessionFact.OpenStatelessSession())
             {
                using (var trans = session.BeginTransaction())
                {
                  for (int  = 0; i < 500000; i++)
                  {
                     Student st = new Student(
                     {  
                          ID = 1,
                          FirstName = "Zia",
                          LastName = "Qammar"
                     });

                     session.Save(st);
                   }

                   trans.Commit();
                }
              }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接