Многопоточный UnitOfWork в Nhibernate - PullRequest
1 голос
/ 25 июля 2011

Мы работаем над сервисом ac # windows, используя NHibernate, который должен обрабатывать пакет записей.

Служба должна обработать около 6000 нечетных записей, и в настоящее время их обработка занимает около 3 часов.Произошло много обращений к базе данных, и хотя мы пытаемся свести их к минимуму, мы также изучаем возможности многопоточности для повышения производительности.

Мы используем шаблон 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, который позволяет только одному сеансу быть доступным.1012 *

Стоит ли смотреть на упаковку UnitOfWork вокруг обработки одной записи?

Любая помощь, высоко ценимая.

Спасибо

Ответы [ 2 ]

4 голосов
/ 25 июля 2011

Лучший способ - запустить новый unitofwork для каждого потока, использовать поток-статический контекстный сеанс NHibernate.Context.ThreadStaticSessionContext.Вы должны знать о детализированных объектах.

2 голосов
/ 26 июля 2011

Самый простой способ - обернуть каждую обработку записи в отдельную единицу работы, а затем запустить каждое UOW в своем собственном потоке.Вы должны убедиться, что каждое UOW & сеанс запускается, используется и завершается в одном потоке.

Чтобы повысить производительность, можно разделить пакет записей на меньшие партии, а затем обернуть обработку этих меньших партий в UOW и выполнить их в отдельных потоках.

В зависимости от вашей рабочей нагрузки использование кэша второго уровня (memcached / membase) может значительно улучшить вашу производительность.(например, если вам нужно прочитать некоторые записи из БД для каждой обработки)

...