【发布时间】:2011-05-24 07:46:54
【问题描述】:
NHibernate 中的StatelessSession 和Session 有什么区别?
【问题讨论】:
-
回答here
标签: c# nhibernate session
NHibernate 中的StatelessSession 和Session 有什么区别?
【问题讨论】:
标签: c# nhibernate session
无状态会话不跟踪检索到的实体。例如对于常规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”的风格处理大型数据集。
【讨论】:
StatelessSession的细节。使用StatelessSession 更新数据库的代码示例怎么样?
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 名学生时,上述代码会引发“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();
}
}
【讨论】: