Nhibernate中的多线程单元工作

时间:2011-07-25 18:40:31

标签: multithreading nhibernate unit-of-work

我们正在使用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?

任何帮助都非常感激。

由于

2 个答案:

答案 0 :(得分:4)

最好的方法是为每个线程启动一个新的工作单元,使用线程静态上下文会话NHibernate.Context.ThreadStaticSessionContext。您必须了解分离的实体。

答案 1 :(得分:2)

最简单的方法是将记录的每个处理包装在它自己的工作单元中,然后在它自己的线程上运行每个UOW。你需要确保每个UOW&会话在单个线程上启动,使用和完成。

为了获得性能,您可以将批量记录分成较小批次,然后将这些较小批次的处理包装到UOW中,并在不同的线程上执行它们。

使用二级缓存(memcached / membase)取决于您的工作负载可能会显着提高您的性能。 (例如,如果您需要从数据库中读取每个处理的一些记录)