【问题标题】:Multithread UnitOfWork in NhibernateNhibernate 中的多线程 UnitOfWork
【发布时间】:2011-07-25 18:40:31
【问题描述】:

我们正在开发一个使用 NHibernate 的 c# windows 服务,它应该处理一批记录。

该服务需要处理大约 6000 条记录,目前大约需要 3 个小时来处理这些记录。有很多 db hits 发生,在我们努力将这些命中率降至最低的同时,我们也在探索多线程选项以提高性能。

我们正在使用 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 包装在处理单个记录的过程中吗?

非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: multithreading nhibernate unit-of-work


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      为了提高性能,您可以将一批记录拆分成更小的批次,然后将这些更小的批次的处理包装到 UOW 中,并在单独的线程上执行它们。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-19
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        相关资源
        最近更新 更多