Как сохранить объект для двух сессий nHibernate? - PullRequest
6 голосов
/ 07 ноября 2008

Я создаю многопоточную систему, которая работает следующим образом:

Пока есть сущности:

  1. Получает сущность из nHibernate (используя текущий сеанс)

  2. Запускает новый поток, который будет работать с этой сущностью *

Когда я запускаю этот новый поток, требуется новый сеанс, потому что nHibernate не является потокобезопасным. Я создаю его, но полученная ранее сущность не работает для этой сессии.

Сегодня я разрешаю эту ситуацию, извлекая из nHibernate новую сущность, передающую идентификатор. Но это дорого, и я пытаюсь сэкономить время для достижения моего SLA.

Есть ли способ связать этот объект с этим новым сеансом без необходимости нового вызова базы данных? Другой сеанс не будет закрыт, все они открыты до конца приложения.

Ответы [ 3 ]

4 голосов
/ 07 ноября 2008

Если вы работаете с отсоединенными объектами, вам придется заново прикрепить их к сеансу. Вы можете сделать это, если у вас есть правильные идентификаторы Hibernate для объектов, с которыми вы работаете, вызывая метод get, а затем объединяете свою копию с только что введенным в сеанс Hibernate. Убедитесь, что вы используете merge, поскольку saveOrUpdate () не удалит дочерние элементы, отсутствующие в отсоединенном объекте, просто добавьте новые дочерние элементы и сохраните изменения в существующих дочерних элементах.

2 голосов
/ 07 ноября 2008

Помимо Evict + Lock вы можете использовать кэш 2-го уровня для восстановления сущностей без обращения к базе данных. Я не знаю, подходит ли оно вашему приложению, но я также думаю, что можно передать сессию на другой шаг, если первый поток перестанет вносить в него изменения.

1 голос
/ 10 ноября 2008

Я отсоединил его от первого потока, после присоединения к другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...