|
|
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
Практически во всех примерах вижу, что обычно время жизни сессии очень короткое. В пределах одного try-catch Открыли сессию, открыли транзакцию, чего-то поделали, закрыли транзакцию, закрыли сессию. Это все хорошо, но не работает при использовании lazy initialization. А как быть в реальном приложении? Хранить глобальную сессию и всегда ее использовать? Что-то не нравится. А как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2006, 09:37 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
Использовать шаблон OpenSessionInView (OpenSessionInViewFilter или OpenSessionInViewInterceptor) в случае использования Spring. Или можно, в принципе, сделать свое по аналогии в Filter. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2006, 10:54 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
Расскажите, пожалуйста, поподробнее. (Spring не использую - маленький ишшо :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2006, 11:01 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
Если работаешь с сервлетами (или struts), то пишешь фильтр, который открывает сессию перед выполнением сервлета и закрывает после. Вместо фильтра можно использовать всяко разные interseptor'ы имеющиеся в спринг/стратс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2006, 11:24 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
Приложение - десктоп ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2006, 11:46 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
fixxerПриложение - десктоп А почему не нравиться держать одну открытую сессию в течение выполнения приложения? (приложение все-таки десктопное). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2006, 11:59 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
AciD_v fixxerПриложение - десктоп А почему не нравиться держать одну открытую сессию в течение выполнения приложения? (приложение все-таки десктопное). Потому что сессия кеширует все объекты доставаемые из базы и нужно либо регулярно их оттуда выкидывать, либо пересоздавать сессию. В десктопном приложении управление сессиями/транзакциями зависит от принятых ахитектурных решений. Если всё намешано в одну кучу (логика, представление, доступ к данным), то будет тяжело. А если есть выделенные бизнес транзакции, то можно открывать и закрывать сессию одновременно с такой траназкцией и будет щастье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2006, 12:24 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
ПетруччииоЕсли работаешь с сервлетами (или struts), то пишешь фильтр, который открывает сессию перед выполнением сервлета и закрывает после. Даже на вебе имхо это не всегда спасает... Порой приходится выкручиваться с чтением полей с lazy-initialization в рамках нескольких request'ов. Вот еще: Open Session in View ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2006, 12:50 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
Петушок Потому что сессия кэширует все объекты, доставаемые из базы и нужно либо регулярно их оттуда выкидывать, либо пересоздавать сессию. Это заблуждение, сессионный кэш или кэш первого уровня кэширует объекты только одной транзакции. см http://www.hibernate.org/hib_docs/v3/reference/en/html/performance.html#performance-cache Возможно, у вас включен кэш второго уровня? По теме вопроса Наиболее идеологически верный подход работы с сессией в hibernate сегодня - это стратегия одна сессия - одна транзакция. Для борьбы же с lazy initialization советую придерживаться правила, что за пределы business tier'а должны попадать только полностью инициализированные объекты. Вообще, старайтесь делать ваш граф объектов проще, используя для этого меньше navigable (в терминах UML) связей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2006, 08:54 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
А можно поподробнее про navigable? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2006, 11:06 |
|
||
|
[Hibernate] стратегия работы с Session
|
|||
|---|---|---|---|
|
#18+
funikovyuri Петушок Потому что сессия кэширует все объекты, доставаемые из базы и нужно либо регулярно их оттуда выкидывать, либо пересоздавать сессию. Это заблуждение, сессионный кэш или кэш первого уровня кэширует объекты только одной транзакции. см http://www.hibernate.org/hib_docs/v3/reference/en/html/performance.html#performance-cache Возможно, у вас включен кэш второго уровня? hibernate in action The Session caches every object that is in persistent state (watched and checked for dirty state by Hibernate). This means it grows endlessly until you get an OutOfMemoryException, if you keep it open for a long time or simply load too much data. One solution for this is to call clear() and evict() to manage the Session cache, but you most likely should consider a Stored Procedure if you need mass data operations. funikovyuri По теме вопроса Наиболее идеологически верный подход работы с сессией в hibernate сегодня - это стратегия одна сессия - одна транзакция. Для борьбы же с lazy initialization советую придерживаться правила, что за пределы business tier'а должны попадать только полностью инициализированные объекты. Вообще, старайтесь делать ваш граф объектов проще, используя для этого меньше navigable (в терминах UML) связей. А как же концепция Unit of work и бизнес транзакции, которые могут состоять более чем из одной системной транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 14:42 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33827190&tid=2148757]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 206ms |
| total: | 483ms |

| 0 / 0 |
