在递归结构中Nhibernate正确的多线程会话处理

时间:2015-03-15 01:25:32

标签: c# multithreading session nhibernate concurrency

我有一些递归结构,如:

Folder+
      |
      +A+AA+AAA
           +AAB
           +AAC
        +AB
        +AC
      +B
      +C

我希望用多个线程处理这个结构,所以我使用了TPL Dataflow:

     m_dataOperationQueue = new ActionBlock<Folder>(x => ProcessFolder(x)
            , new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 5 });

当我处理一些我想要的文件夹

  1. 将处理结果保存到数据库中
  2. 更新每个孩子并从完成的项目处理中添加一些结果
  3. 从数据库中删除已处理的文件夹
  4. 将子文件夹排队以进行处理
  5. 我最喜欢的是Nhibernate会话管理,我收到了很多错误 - 大多数会话已经关闭。

    对于会话管理我使用NHibernateIntegration与windsor城堡和AutoTX工具我可以访问原始的NHibernate sessionFactory。处理这些操作的正确方法是什么,以及如何在此场景中管理会话以避免会话关闭。

    我的保存操作如下所示:

        [Transaction(TransactionMode.Requires)]
        public virtual Folder SaveNewFolder(Folder folder)
        {
            using (var session = SessionManager.OpenSession())
            {
               session.Save(folder); //At this line i have most errors
            }
        }
    

1 个答案:

答案 0 :(得分:0)

我可以在你的方法中看到一些问题,

  1. 当您递归保存文件夹时,首先保存父文件夹并将子文件夹排入队列以进行处理,但问题是当您持久化时NHibernate会继续并持续所有AA,AAA,AAB ...,AB ...等级只是因为A会引用AA..AB。因此,将子文件夹保存在单独的线程中不会起作用,因为它们已经保留,而另一个线程A没有正确保留。

  2. 一旦您对父文件夹进行处理,它就会被删除。当您删除父级时,子实体也很可能会被删除,而在另一个线程中,您试图保留删除父实体的子实体,这对于NhHbernate来说会非常混乱。