Потокобезопасность NHibernate с сессией

Это должно помочь!

act.byHour_corr$date <- as.Date(gsub('Activity on ', '', act.byHour_corr$date),
                                format = '%m/%d/%Y')
act.byHour_corr <- act.byHour_corr[order(act.byHour_corr$date),]

Удаляет часть «Активность на» столбца. Это работает, или вам нужно сохранить часть «Активность на»?

12
задан Piotr Dobrogost 6 July 2009 в 16:34
поделиться

3 ответа

В то время как я не видел Вашу всю кодовую базу или проблема, Вы пытаетесь решить, пересмотр прежнего мнения того, как Вы используете NHibernate, мог бы быть в порядке. Из документации:

Необходимо наблюдать применяющие методы при создании NHibernate Sessions:

  • Никогда не создавайте больше чем один параллельный ISession или экземпляр ITransaction соединение для каждой базы данных.

  • Будьте чрезвычайно осторожны при создании больше чем одного ISession для каждой базы данных на транзакцию. Сам ISession отслеживает обновления, сделанные к загруженным объектам, таким образом, другой ISession мог бы видеть устаревшие данные.

  • ISession не ориентирован на многопотоковое исполнение! Никогда не получайте доступ к тому же ISession в двух параллельных потоках. ISession обычно является только единицей работы!

Тот последний бит является самым релевантным (и важным в случае многопоточной среды) к тому, что я говорю. ISession должен использоваться однажды для маленькой атомарной операции и затем располагаться. Также из документации:

ISessionFactory является дорого создаваемым, ориентированным на многопотоковое исполнение объектом, предназначенным, чтобы быть совместно использованным всеми потоками приложения. ISession является недорогим, неориентированным на многопотоковое исполнение объектом, который должен использоваться однажды, для единственного бизнес-процесса, и затем отбрасываться.

Объединение тех двух идей, вместо того, чтобы хранить сам ISession, хранит фабрику сессии, так как это - "большой" объект. Можно затем использовать что-то как SessionManager. GetSession () как обертка для получения фабрики от сессии хранят и инстанцируют сессии и используют ее для одной операции.

Проблема также менее очевидна в контексте приложения ASP.NET. Вы статически определяете объем объекта ISession, что означает, что он совместно используется через AppDomain. Если два различных запроса Page создаются в том, что время жизни AppDomain и выполняется одновременно, у Вас теперь есть Две страницы (различные потоки) касание того же ISession, который не безопасен.

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

Править:

Хорошо, я вижу, где Вы пытаетесь пойти с этим. Это кажется, что Вы пытаетесь реализовать Открытое заседание В поле зрения шаблон и там пара различных маршрутов, можно взять это:

Если добавление другой платформы не является проблемой, изучите что-то как Spring.NET. Это является модульным, таким образом, Вы не должны использовать все это, Вы могли просто использовать модуль помощника NHibernate. Это поддерживает открытое заседание в поле зрения шаблон. Документация здесь (направляющийся 21.2.10. "Веб-управление сеансами").

Если Вы прокрутили бы свое собственное, проверьте эту регистрацию codeproject Bill McCafferty: "Лучшие практики NHibernate". К концу он описывает реализацию шаблона через пользовательский IHttpModule. Я также видел сообщения вокруг Интернета для реализации шаблона без IHttpModule, но это могло бы быть тем, что Вы пробовали.

Мой обычный шаблон (и возможно Вы уже перескочили здесь), использование платформа сначала. Это снимает много головных болей. Если это слишком медленно или не соответствует моим потребностям затем, я пытаюсь настроить конфигурацию или настроить ее. Только после этого сделайте я пытаюсь прокрутить свое собственное, но YMMV.:)

24
ответ дан 2 December 2019 в 05:42
поделиться

Я не могу быть уверен (поскольку я - Java, в спящем режиме парень) в NHibernate, но в в спящем режиме, объекты Сессии не ориентированы на многопотоковое исполнение дизайном. Необходимо открыть и закрыть сеанс и никогда не позволять его из объема текущего потока.

Я уверен, что шаблоны, такие как 'Представление открытого заседания' были реализованы в .NET где-нибудь.

Другая интересная проблема - при помещении быть в спящем режиме объекта в сессию. Проблема здесь состоит в том, что сеанс, к которому это присоединено, будет закрыт (или должен быть) на окончании запроса. Необходимо повторно прикрепить объект к новому (в спящем режиме) сессия, если Вы хотите переместиться по кому-либо не загруженные ассоциации. Это в он сам, вызывает новую проблему, если два запроса пытаются сделать это в то же время, что и что-то аварийно завершится, при попытке присоединить объект к двум сессиям.

Надеюсь, это поможет. Gareth

2
ответ дан 2 December 2019 в 05:42
поделиться

Проблема в том, что моя библиотека для инверсии управления неправильно управляла объектами, создаваемыми в контексте HTTP, поэтому я получал ссылки на объекты, которые не должны были быть доступны для в этом контексте. Это было с использованием Ninject 1.0, когда я обновился до Ninject 2.0 (бета), проблема была решена.

1
ответ дан 2 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: