|
|
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Добрый день! Хочется критики на идею и реализацию. Проблема известная- ссылки с "fetch = FetchType.LAZY" надо подгружать пока не завершилась сессия. А она завершается быстро :) А хочется иметь возможно загрузить потом не городя кучу кода. Решение. 1. Сделаем так, чтобы один Remote-интерфейс всегда реализовывался одним бином и их имена были строго связаны (у меня для xx.xxx.YyyRemote всегда xx.xxx.YyyBL). 2. Пишем класс со статическим методом, который по Class<YyyRemote> получает ссылку на реализацию. 3. Пишем класс LazyLink с геттером Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 4. Где нужна ленивая ссылка пишем [src] @Column(name = "svcId") @Type(type="xx.xxx.LazyLinkMapping") private LazyLink svc; public NsSvcRef getSvc() { return svc.get(NsSvcRefRemote.class); } [src] Соответственно ленивая ссылка будет разрешена ровно в нужный момент без всяких exception'ов. Как сама идея? Попробую обобщить на @OneToMany - надо будет изучить хибернейт получше... -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 09:06:12 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
GKS_Samara, А так ли нужно бороться с LAZY? У меня никогда в жизни проблем с ним не возникало. ИМХО если программист отгребает LazyLoadingExeption значит он не в теме как должна работать его программа, заблудился в ORM и не отдаёт себе отчёт какие данные ему понадобятся в каждый конкретный момент времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 11:20:50 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Добрый день, vimba! > А так ли нужно бороться с LAZY? Получили сущность A a. А у неё есть a.getB().getC().getD().getE().getF() И вот надо в какой-то момент её получить. И либо сразу грузить это дерево (очень большое иногда получается), либо время от времени делать что-нибудь вроде refresh(a.getB().getC().getD()).getE() - это если мы решили до 3 уровня грузить ссылки. Либо ещё как извращаться. И постоянно ходишь по минному полю- то ли не получишь эту ссылку (если грузили A, а D передали в метод, который даже не знает, что ему достался огрызок с незагруженными ссылками), то ли загрузишь лишнего (а БД такая, что любой сервер треснет очень быстро от такой работы). -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 11:31:33 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
GKS_Samara, а можешь пример выше подкрепить минимальным кодом с ошибкой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 11:38:40 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Добрый день, Petro123! > а можешь пример выше подкрепить минимальным кодом с ошибкой? Сейчас проблема не в лази, а в излишней загрузке. Т.е. загрузка списка объектов иногда идёт очень долго. Чаще всего из-за того, что подгружается очень много объектов. Если смотреть запросы на БД, то идёт join на 20-30 таблиц- легко. И хотя индексы везде есть (PK обычно), но при наших объёмах (десятки миллионов записей на таблицу) БД начинает тормозить просто на физических чтениях (понятное дело, что кэша тут никак не хватит на сотню пользователей, даже у супердома). -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 11:53:44 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Session.merge() и грузим ленивые свойства. Равзе нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 12:38:17 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Добрый день, Blazkowicz! > Session.merge() и грузим ленивые свойства. Равзе нет? А в JPA есть подобное? persist? Кроме того, код может выполнятся и на толстом клиенте трёхзвенки, а там до контекста далеко :) -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 12:50:56 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraА в JPA есть подобное? persist? Ты ещё про андроид спроси. А че, в ЖПА вроде оба есть. Не? http://stackoverflow.com/questions/1069992/jpa-entitymanager-why-use-persist-over-merge GKS_SamaraКроме того, код может выполнятся и на толстом клиенте трёхзвенки, а там до контекста далеко :) Толстый клиент отдельная тема вообще. Там разные могут быть варианты. Посмотри Gilead для GWT, он для толстого клиента не обязательно подойдёт, но мысли интересные подчерпнуть можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 12:54:54 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Не очень понял зачем какие-то аннотации. Если догружать надо на толстом клиенте, то проще все сущности обернуть в AOP и если свойство не загружено, то делать удаленный вызов по id. Моё мнение, что это лишняя трата времени на отдельный фреймверк, потому что в дальнейшем придется все равно бороться с производительностью с помощью FetchMode. Вроде недавно был флейм на эту тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 12:58:35 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
я конечно не очень давно с хибером балуюсь, но до сих пор все вопросы решались правильным указанием join fetch. у тебя проблема в определении где и какие данные нужны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 14:03:12 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Добрый день, chpasha! > я конечно не очень давно с хибером балуюсь, но до сих пор все вопросы > решались правильным указанием join fetch. у тебя проблема в определении > где и какие данные нужны? Проблема в том, что в метод, который вообще не работает с БД, приходит объект. И ему надо прочитать какое-то свойство. А прочитано ли оно- зависит от того, кто и как читал этот объект. Вот это и не нравится. -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 14:29:44 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Добрый день, Blazkowicz! > Не очень понял зачем какие-то аннотации. Если догружать надо на толстом > клиенте, то проще все сущности обернуть в AOP и если свойство не > загружено, то делать удаленный вызов по id. В целом моё предложение похоже :) > Посмотри Gilead для GWT, он для толстого клиента > не обязательно подойдёт, но мысли интересные почерпнуть можно. Почитаю, спасибо. -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 14:30:53 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
GKS_Samara, Не очень врубаюсь в проблему. Во время запроса ленивого свойства, сессия ведь открыта. Почему объект, видя что вместо данных нуллл не запросит данные в бд? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 15:59:57 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Petro123Во время запроса ленивого свойства, сессия ведь открыта. При толстом клиенте - не обязательно. Petro123Почему объект, видя что вместо данных нуллл не запросит данные в бд? Там не null. Там id без самого объекта. По null нельзя определить то ли нет ассоциации, то ли есть, но не загружена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 16:01:54 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Я только про тонкий с сессией на запрос. У толстого другие принципы. У тонкого тоже айдишник? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 16:07:37 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Petro123Я только про тонкий с сессией на запрос. У толстого другие принципы. У тонкого тоже айдишник? На толстом всё зависит от того как будешь сериализовать. Если Java сериализацией, то там будут полноценные сущности с той лишь разницей что негда взять сессию, чтобы прицепиться для ленивого чтения. Если сериализовать в DTO, то нужно будет изобретать заново многое из того что уже есть в ORM. Трекинг удаления, например. Ну и ленивые свойства, если захочется. Но я пока не вижу нафиг они на клиенте. FetchMode наше всё. Вот тут интересные раздумья по теме http://blogs.gotdotnet.ru/personal/bezzus/PermaLink.aspx?guid=7a6a69bd-bedf-425f-b09c-123b4a41f686 Только там надо фильтровать отдельно Anemic vs Rich, отдельно тему ленивой загрузки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 16:27:30 |
|
||
|
Hibernate - про борьбу с LAZY
|
|||
|---|---|---|---|
|
#18+
Ссылка не работает. В своем веб-проекте с удивлением заметил, что в некоторых случаях фильтр OpenSessionInViewFilter срабатывал, в некоторых нет. Поэтому иногда подчитать ленивые зависимости не получалось. Выкинул вовсе этот фильтр и воспользовался возможностями из прокси-пакета хибера: Код: java 1. 2. 3. 4. 5. 6. Автоматизм, конечно, свелся к нулю - каждую сущность надо прогонять через этот метод, но зато железобетон ... Хотя в рамках приложения, которое планируется как высоконагруженное масштабируемое, где количество JOIN'ов надо свести к минимуму (следовательно, архитектурно выгоднее заменить многие ленивые зависимые коллекции на дополнительный "лишний" запрос), оказывается не таким уж и затратным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2012, 16:45:09 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37993264&tid=2130793]: |
0ms |
get settings: |
19ms |
get forum list: |
30ms |
check forum access: |
9ms |
check topic access: |
9ms |
track hit: |
79ms |
get topic data: |
23ms |
get forum data: |
5ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
| others: | 324ms |
| total: | 573ms |

| 0 / 0 |
