我正在尝试使用NHibernate进行批量更新,但它没有执行批量更新,它为所有行执行单独写入操作。我必须写大约10k行到db。nhibernate:批量执行更新
using (var session = GetSessionFactory().OpenStatelessSession())
{
session.SetBatchSize(100);
using (var tx = session.BeginTransaction())
{
foreach (var pincode in list)
{
session.Update(pincode);
}
tx.Commit();
}
}
我试着用session.SetBatchSize(100);
批量大小设置为100,但它不能帮助。还尝试使用cfg.SetProperty("adonet.batch_size", "100");
设置批量大小,但那也没有帮助。
我使用GUID主键,因此我不明白批量更新失败的原因。这正是解释为here的解决方案。但它不适合我。
注意我有乐观并发版本字段映射到所有实体。这可能是没有批量更新的罪魁祸首?
编辑
我试图用国家FUL会议,但也没有帮助
//example 2
using (var session = GetSessionFactory().OpenSession())
{
session.SetBatchSize(100);
session.FlushMode = FlushMode.Commit;
foreach (var pincode in list)
{
session.Update(pincode);
}
session.Flush();
}
//example 3
using (var session = GetSessionFactory().OpenSession())
{
session.SetBatchSize(100);
using (var tx = session.BeginTransaction())
{
foreach (var pincode in list)
{
session.Update(pincode);
}
tx.Commit();
}
}
example 2
由于某种原因导致双往返。
编辑
经过进一步的研究,我发现,每个session.Update实际上是在更新数据库
using (var session = SessionManager.GetStatelessSession())
{
session.SetBatchSize(100);
foreach (var record in list)
{
session.Update(record);
}
}
我怎样才能避免这种情况。
编辑
与洗净模式尝试为好,但是那也没有帮助
using (var session = SessionManager.GetNewSession())
{
session.FlushMode = FlushMode.Never;
session.SetBatchSize(100);
session.BeginTransaction();
foreach (var pincode in list)
{
session.SaveOrUpdate(pincode);
}
session.Flush();
session.Transaction.Commit();
}
EDIT 4
甚至低于一个不能正常工作,因为我正在获取所有实体在同一会话中,并且只在该会话中更新并保存它们...
using (var session = SessionManager.GetSessionFactory().OpenSession())
{
session.SetBatchSize(100);
session.FlushMode = FlushMode.Commit;
session.Transaction.Begin();
var list = session.QueryOver<Pincode>().Take(1000).List();
list.ForEach(x => x.Area = "Abcd" + DateTime.Now.ToString("HHmmssfff"));
foreach (var pincode in list) session.SaveOrUpdate(pincode);
session.Flush();
session.Transaction.Commit();
}
如果你的pincode是代理,你不需要调用'session.Update(pincode);如果是这样,如果你改变实体并调用'session.Flush();'会发生什么? – mxmissile 2014-10-20 20:08:27
nopes这些不是代理,这些对象是从另一个无状态会话中的数据库中获取的,应用了一些业务逻辑,然后批量保存... – harishr 2014-10-20 20:14:50
在这种情况下,请参阅下面的Oskar的答案。 – mxmissile 2014-10-20 20:22:01