我有一个简单的批处理机制,它将从原始数据库中获取X实体,然后将它们插入临时数据库。
批处理和插入功能:
public IEnumerable<Article> GetEntitiesBatch(int startingId, int chunk)
{
return _session.Query<Article>()
.Where(x => x.Id > startingId)
.OrderBy(x => x.Id)
.Take(chunk).ToList();
}
public void InsertTemporaryArticles(List<Article> articles)
{
using (var transaction = _statelessSession.BeginTransaction())
{
_statelessSession.SetBatchSize(articles.Count);
articles.ForEach(ac => _statelessSession.Insert(ac));
transaction.Commit();
}
}
主要功能的代码流程:
private void ProcessBatch(int idToCheck)
{
do
{
var articles = GetEntitiesBatch(idToCheck, batchSize).ToList();
if (!articles.Any())
{
return;
}
InsertTemporaryArticles(articles);
// Still more to check. Can continue.
if (articles.Count == batchSize)
{
idToCheck = articles.Last().Id;
}
else
{
return;
}
} while (true);
}
假设我的原始表有7500个元素(文章)。我一直得到这个值为1000的批处理,一切正常,这意味着我的临时表也将填充7500个元素。如果我将批量大小减小到2(例如),并非所有文章都将发送到我的临时数据库。我通常会收到相同数量的文章,例如7495而不是7500。
作为ORM,我正在使用Fluent NHibernate。
你们之前曾经历过这样的经历吗?我不知道为什么会这样。