Spring + Hibernate + multithreading
От: Pharod  
Дата: 20.06.06 11:41
Оценка:
Привет всем,

Используем Spring и Hibernate в многопоточном приложении, есть сценарии когда get() делаем в одном трэде а сохранием в базу обновленный уже в другом трэде. насколько я понимаю, Spring — мы используем HibernateTemplate — привязывает открытые сессии к трэдам с помощью ThreadLocal — в итоге мы видим исключение — "HibernateException: Illegal attempt to associate a collection with two open sessions".
Как "попросить" Spring использовать одну long-live сессию для всего приложения? Или есть еще варианты решения?
wbr,
Igor
Re: Spring + Hibernate + multithreading
От: kan_izh Великобритания  
Дата: 20.06.06 12:05
Оценка:
Pharod wrote:

> Используем Spring и Hibernate в многопоточном приложении, есть сценарии

> когда get() делаем в одном трэде а сохранием в базу обновленный уже в
> другом трэде. насколько я понимаю, Spring — мы используем
> HibernateTemplate — привязывает открытые сессии к трэдам с помощью
> ThreadLocal — в итоге мы видим исключение — "HibernateException: Illegal
> attempt to associate a collection with two open sessions".
> Как "попросить" Spring использовать одну long-live сессию для всего
> приложения? Или есть еще варианты решения?
Объект можно детачить от сессии evict()
По-моему, правильнее работать с объектом из одного треда. А иначе как ты представляешь себе работу с транзакциями?
Сессия по замыслу должна принадлежать только одному треду. Или, в крайнем случае, надо покопать в направлении, как
передавать сессию от одного треда к другому.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Spring + Hibernate + multithreading
От: Pharod  
Дата: 20.06.06 12:27
Оценка:
>> По-моему, правильнее работать с объектом из одного треда. А иначе как ты представляешь себе работу с транзакциями?

Нельзя ли поподробннее? Возможно я что то не понимаю — но очень хочу понять... чем трэды мешают?
wbr,
Igor
Re[3]: Spring + Hibernate + multithreading
От: kan_izh Великобритания  
Дата: 20.06.06 12:44
Оценка:
Pharod wrote:

>> > По-моему, правильнее работать с объектом из одного треда. А иначе как

> ты представляешь себе работу с транзакциями?
>
> Нельзя ли поподробннее? Возможно я что то не понимаю — но очень хочу
> понять... чем трэды мешают?
Тем, что обычно в транзакции должна быть жестко заданная последовательность — begin,do_1,do_2,...,do_n,commit|rollback.
Треды не позволяют делать несколько действий в строгой последовательности (точнее можно извратиться, но чревато ошибками
типа race condition).
В общем, почитай http://en.wikipedia.org/wiki/ACID а потом попробуй представить себе, как всё это можно обеспечить в
транзакциях, размазанных по нескольким потокам.

А как ты spring используешь? Я, например, DAO использовал, он позволяет каждый метод бина оборачивать транзакцией
(притом есть R/O транзакции, и R/W).
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Spring + Hibernate + multithreading
От: Pharod  
Дата: 20.06.06 12:56
Оценка:
_>Тем, что обычно в транзакции должна быть жестко заданная последовательность — begin,do_1,do_2,...,do_n,commit|rollback.
_>Треды не позволяют делать несколько действий в строгой последовательности (точнее можно извратиться, но чревато ошибками
_>типа race condition).

Если все упростить то так: один трэд берет из базы объекты и ставит в очередь. Пул трэдов обрабатывает эти объекты и сохраняет измененные обратно в базу. Read я полагаю оборачивать в транзакцию не нужно. Отдельные update видимо тоже?

_>А как ты spring используешь? Я, например, DAO использовал, он позволяет каждый метод бина оборачивать транзакцией

_>(притом есть R/O транзакции, и R/W).

Он позволяет, но зачем? Мне бы по идее одну сессию и я по ней синхронизируюсь. Основное время — 99% идет обработка данных. Сама операция update не убъет перфоманс даже если я буду все трэды синхронизировать по одной сесси.

Вот только как сделать одну сессию?
wbr,
Igor
Re: Spring + Hibernate + multithreading
От: hiron  
Дата: 20.06.06 15:33
Оценка:
Здравствуйте, Pharod, Вы писали:

P>Привет всем,


P>Используем Spring и Hibernate в многопоточном приложении, есть сценарии когда get() делаем в одном трэде а сохранием в базу обновленный уже в другом трэде. насколько я понимаю, Spring — мы используем HibernateTemplate — привязывает открытые сессии к трэдам с помощью ThreadLocal — в итоге мы видим исключение — "HibernateException: Illegal attempt to associate a collection with two open sessions".

P>Как "попросить" Spring использовать одну long-live сессию для всего приложения? Или есть еще варианты решения

Можно попробовать сессии закрывать в reader thread перед тем, как поместить объект в пул, тогда к моменту когда Spring попытается привязать объект к сессии из writer thread он не будет ругаться на вторую открытую сессию. Можно ещё попробовать жадно загружать объекты, чтоб ссылок на сессию в коллекциях не было, но тут я могу ошибаться, возможно они всё равно будут — глубже копаться не охота.
Использовать одну long-live сессию для всего приложения вряд ли получиться, авторы задумывали её для другого: An instance of Session is lightweight and is inexpensive to create and destroy. This is important because your application will need to create and destroy sessions all the time, perhaps on every request.
Как показывает опыт, попытки использовать Hibernate не так, как авторы изначально задумывали, чреваты.
Re[5]: Spring + Hibernate + multithreading
От: kan_izh Великобритания  
Дата: 20.06.06 15:47
Оценка:
Pharod wrote:

> Если все упростить то так: один трэд берет из базы объекты и ставит в

> очередь. Пул трэдов обрабатывает эти объекты и сохраняет измененные
> обратно в базу. Read я полагаю оборачивать в транзакцию не нужно.
> Отдельные update видимо тоже?
Почему? Ведь может isolation пострадать. Если объект читается по частям, прочитанные части могут быть изменены,
остальные части прочитаться позднее, получим объект в странном состоянии.
Ситуация, конечно, редкая, но если случится, то будет большая Ж.

> _>А как ты spring используешь? Я, например, DAO использовал, он

> позволяет каждый метод бина оборачивать транзакцией
> _>(притом есть R/O транзакции, и R/W).

> Он позволяет, но зачем? Мне бы по идее одну сессию и я по ней

А что тогда вообще у тебя спринг делает?

> синхронизируюсь. Основное время — 99% идет обработка данных. Сама

> операция update не убъет перфоманс даже если я буду все трэды
> синхронизировать по одной сесси.
Не в перформансе дело, а в транзакционности...

> Вот только как сделать одну сессию?

Смотри на конфигурацию спринга. Я использовал из web, там явно привязывается сессия к сервлету (специальные классы есть
в org.springframework.web.*, которые это и обеспечивают). Как используется у тебя, я не знаю. Но, видимо, какой-то
специальный класс, который в thread-local сессию засовывает (чудес не бывает ). Каким методом ты объект сессии
получаешь? Почему этот объект нельзя другим тредам передать?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.