无状态会话和 NHibernate 中的会话有什么区别

本文关键字:会话 什么 区别 NHibernate 状态 | 更新日期: 2023-09-27 17:57:24

NHibernate中的StatelessSessionSession有什么区别?

无状态会话和 NHibernate 中的会话有什么区别

无状态会话不跟踪检索到的实体。例如,对于常规代码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"的风格处理大型数据集。

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

 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();
            }
          }

上面的代码在数据库中插入 50,000 名学生时抛出"内存异常"异常。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();
                }
              }