NHibernate中StatelessSession
和Session
之间有什么区别?
答案 0 :(得分:20)
无状态会话不跟踪检索的实体。例如,常规ISession
以下代码:
var session = sessionFactory.OpenSession()
using(var transaction = session.BeginTransaction()){
var user = session.Get<User>(1);
user.Name = "changed name";
transaction.Commit();
}
将导致DB更新。由于跟踪实体的数量在增长,此跟踪会消耗内存并使ISession
性能随着时间的推移而降低。
IStatelessSession
的相同代码不会执行任何操作。当您需要加载大量数据并执行一些批处理操作时,将使用无状态会话。它可用于以更“ado.net”的方式处理大型数据集。
答案 1 :(得分:1)
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();
}
}