我们正在使用NHibernate开发一个c#windows服务,它应该处理一批记录。
该服务必须处理大约6000个奇数记录,目前需要大约3个小时来处理这些记录。发生了大量的db命中,当我们尝试最小化这些时,我们也在探索多线程选项以提高性能。
我们正在使用UnitOfWork模式来访问NHibernate会话。
这大致是服务的外观:
public class BatchService
{
public DoWork()
{
StartUnitOfWork();
foreach ( var record in recordsToBeProcessed)
{
Process(record);
// Perform lots of db operations
}
StopUnitOfWork();
}
}
我们正在考虑使用任务并行库来尝试批量处理这些记录(使用Parallel.Foreach()方法)。 从我到目前为止所读到的NHibernate,我们应该为每个线程提供一个单独的NHibernate会话。
我的查询是如何提供这个..考虑UnitOfWork模式,它只允许一个会话可用。
我是否应该考虑围绕处理单个记录包装UnitOfWork?
任何帮助都非常感激。
由于
答案 0 :(得分:4)
最好的方法是为每个线程启动一个新的工作单元,使用线程静态上下文会话NHibernate.Context.ThreadStaticSessionContext
。您必须了解分离的实体。
答案 1 :(得分:2)
最简单的方法是将记录的每个处理包装在它自己的工作单元中,然后在它自己的线程上运行每个UOW。你需要确保每个UOW&会话在单个线程上启动,使用和完成。
为了获得性能,您可以将批量记录分成较小批次,然后将这些较小批次的处理包装到UOW中,并在不同的线程上执行它们。
使用二级缓存(memcached / membase)取决于您的工作负载可能会显着提高您的性能。 (例如,如果您需要从数据库中读取每个处理的一些记录)