|
|
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
Есть вэб-сервис, на базе Axis. Сервис предоставляет методы типа getObjectById, getAllObjects, updateObject, deleteObject и т д. Когда клиенты (GUI) вызывают один из этих методов сервиса, в таком методе сначала открывается Hibernate-сессия, начинается транзакция, в контексте которой выполняется та или иная операция с БД - если все ок - транзакция коммитится, эксепшен - откатывается. В конце работы метода Hibernate-сессия закрывается. Т е, при каждом вызове одно из таких методов приходиться открывать сессию, а в конце метода закрывать. А возможно ли сделать так, чтобы при первом обращении клиента к веб-сервису для него создавалась отдельная Hibernate-сессия, в контексте которой и происходили бы вызовы всех этих методов. А когда клиент отсоединяется от сервера - эта сессия закрывалась бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 19:08 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
Очень плохое решение. Открывать / закрывать сессии на каждый запрос в большинстве случаев дешевле, чем держать кучу ждущих соединений. Сессия открывается легко - всего и делов-то только взять из пула соединение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 19:52 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
Я имел в виду, что каждая ждущая сессия будет у Вас держать свое соединение. Если же Вы будете в начале обработки запроса подключать сессию ( reconnect() ), а по окончании обработки закрывать ( disconnect() ), то это может оказаться приемлемо. Но все равно держать много сессий (даже при том, что это "легкий" объект) имеет смысл только в том случае, если в них хранится состояние или кэшируются часто нужные клиенту данные. Но в этом случае придется за все мэтим смотреть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 19:57 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
Все дело в том, что в БД очень много связей и при запросе например того же юзера по его ID, метод ( допустим: User getUserById(long userId); ) возвращает объект User cо списком ролей, принадлежащих этому пользователю и списком привелегий, принадлежащих этим ролям и т д. Так происходит, потому что в хибернайт-маппинге прописано lazy="false". Использовать lazy="true" я не могу, посколько при вызове этого метода getUserById я открыл хибернайт-сессию получил объект User и закрыл сессию. Поэтому и возникает потребность иметь хибернейт-сессию открытой для всего сеанса работы. Те ситуация примерно такая: Допустим мне надо отобразить список всех юзеров в БД, а затем, ВОЗМОЖНО я захочу посмотреть его роли, а ВОЗМОЖНО и не за хочу. Но поскольку вызов любого метода связан с открытием и закрытием сессии, я не могу использовать фичу lazy="true", которая даст возможность не подкачивать все связи юзера с ролями, ролей с привелегиями и т д. Может кто то сталкивался с похожим. Интересуют способы решения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 10:43 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
Каша какая-то. "...поскольку вызов любого метода связан с открытием и закрытием сессии..." - почему? Вы можете открыть сессию и вызывать сколько угодно методов - как Hibernate, так и своих собственных. И с чего бы это нельзя использовать lazy="true"? Как раз НАДО использовать, если хотите иметь гибкость и не заставлять код делать ненужные операции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 11:31 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
Когда клиент хочет получить конкретного юзера, он вызов метод getUserById(lond id): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Те допустим клиент вызвал этот метод и пусть lazy="true" - получил юзера. Дальше я хочу получить роли этого юзера: user.getRoles(). Но я не смогу этого сделать, потому что хибернайт-сессия уже закрыта! и этот юзер уже не связан с сесиией вызов user.getRoles() при закрытой сессии кинет эксепшен. Поэтому в настоящий момент я использую lazy="false" и тяну все связи эзера с другими объектами - что очень накладно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 12:16 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
М.ГоловановКаша какая-то. "...поскольку вызов любого метода связан с открытием и закрытием сессии..." - почему? Вы можете открыть сессию и вызывать сколько угодно методов - как Hibernate, так и своих собственных. И с чего бы это нельзя использовать lazy="true"? Как раз НАДО использовать, если хотите иметь гибкость и не заставлять код делать ненужные операции. А как удаленному клиенту открыть хибернэйт-сессию и далее в ее контектсе вызывать различные методы ? Допустим у вэб-сервиса есть дополнительно методы openSession() и closeSession(), открывающие и закрывающие хибернайт сесиию. Если удаленный клиент вызвает: 1. openSession() - создал сесиию 2. getUserById(long id) Как в вызове второго метод getUserById() получить эту сессию, если все мотоды независимы друг от друга ? Гдк и как хранить эту сессию ? А если к сервису обратилось несколько клиентов и они вызвали: 1. openSession() - создал сесиию 2. getUserById(long id) Как понять где какая сессия и с каким клиентом она связана ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 12:32 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
AndreySerjТе допустим клиент вызвал этот метод и пусть lazy="true" - получил юзера. Дальше я хочу получить роли этого юзера: user.getRoles(). Но я не смогу этого сделать, потому что хибернайт-сессия уже закрыта! и этот юзер уже не связан с сесиией вызов user.getRoles() при закрытой сессии кинет эксепшен. Ну вы даете. Ну загрузите роли ДО того, как закроется сессия (то есть в том блоке, в котором у Вас user = (User) session.load(User, id); . И все дела. Во-вторых, зачем для чтения открывать и контролировать транзакцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 12:50 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
AndreySerj А если к сервису обратилось несколько клиентов и они вызвали: 1. openSession() - создал сесиию 2. getUserById(long id) Как понять где какая сессия и с каким клиентом она связана ? В каком смысле? Сессия связана с тем клиентом, который и вызвал openSession(). Или еще какие-то связи нужны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 12:53 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
М.Голованов AndreySerjТе допустим клиент вызвал этот метод и пусть lazy="true" - получил юзера. Дальше я хочу получить роли этого юзера: user.getRoles(). Но я не смогу этого сделать, потому что хибернайт-сессия уже закрыта! и этот юзер уже не связан с сесиией вызов user.getRoles() при закрытой сессии кинет эксепшен. Ну вы даете. Ну загрузите роли ДО того, как закроется сессия (то есть в том блоке, в котором у Вас user = (User) session.load(User, id); . И все дела. Во-вторых, зачем для чтения открывать и контролировать транзакцию? Сори, наверное я торможу.... ;-) Метод getUserById(...) - это метод вэб-сервиса. Этот метод удаленно вызывает GUI-клиент. Мне читать роли юзера надо не всегда, в большинстве случаев достаточно просто просмотреть его имя и т д. Но иногда нужно и почитать его роли. Вот здесь бы lazy="true" и помогло бы мне (если б не закрытие сессии). А так я всегда тяну с юзером и его роли, надо мне их смотреть или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 13:48 |
|
||
|
Hibernate + Axis
|
|||
|---|---|---|---|
|
#18+
М.Голованов AndreySerj А если к сервису обратилось несколько клиентов и они вызвали: 1. openSession() - создал сесиию 2. getUserById(long id) Как понять где какая сессия и с каким клиентом она связана ? В каком смысле? Сессия связана с тем клиентом, который и вызвал openSession(). Или еще какие-то связи нужны? GUI-клиент вызывает методы УДАЛЕНHОГО вэб-сервиса. Типа: Код: plaintext 1. 2. 3. 4. Соответствующий метод вэб-сервиса getUserById, открывет хибернайт-сессию, вытягивает юзера и закрывает сесиию. Как клиент связан с этой хибернайт-сесиией ? Вызов другого метода вэб-сервиса происходит уже в своей(новой) сессии. И вообще, как клиент позже может закрыть конкретную хибернайт-сессию, которую он создал ранее, вызвав метод сервиса openSession? - ведь клиент ничего не знает об этом, все что он может - вызывать удаленные методы вэб-сервиса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 13:58 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33440418&tid=2150662]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
153ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 501ms |

| 0 / 0 |
