Почему не использовать OpenEntityManagerInViewFilter Spring

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

int i = 3;
double d = 3.0;

я и d были бы, имеют эквивалентные отношения, так как они представляют то же значение, но не равенство, так как у них есть различные типы. Другие языки могут иметь различные идеи эквивалентности (такой как, представляют ли две переменные тот же объект).

37
задан 8 October 2009 в 14:36
поделиться

3 ответа

As you said, the OpenSessionInView filter is very convenient in web applications. Regarding the limitations you mentioned:

1) Loading several lazy associations will result in multiple database transactions, a possible hit on performance.

Yes, going to the DB often might lead to performance problems. Ideally you want to fetch all the data you need in one trip. Consider using Hibernate join-fetch for this. But fetching too much data from the DB will also be slow. The rule of thumb I use is to use join fetching if the data is needed every time I paint the view; if the data is not needed in most cases, I let Hibernate lazy fetch it when I need it - the threadlocal open session helps then.

2) The root object and its lazy associations are loaded in different database transactions, so the data may possibly be stale (e.g. root loaded by thread 1, root associations updated by thread 2, root associations loaded by thread 1).

Imagine writing this application in JDBC - if the application's consistency requirements demand that the root and leaves both should be loaded in the same txn, use join fetching. If not, which is often the case, lazy fetching won't lead to any consistency problems.

IMHO, the more important disadvantage with OpenSessionInView is when you want your service layer to be reused in a non-web context. From your description, you don't seem to have that problem.

9
ответ дан 27 November 2019 в 05:03
поделиться

Главный аргумент, который я слышал против OpenSessionInView и отложенной загрузки, - это избыток транзакций и отрицательное влияние на производительность. Его чрезвычайно удобно использовать в приложении с низкими требованиями к использованию, но в крупномасштабном приложении я бы рекомендовал использовать старомодные полностью заполненные DTO (объекты передачи данных).

4
ответ дан 27 November 2019 в 05:03
поделиться

Одна из основных проблем, с которой я столкнулся при работе с OpenSessionInViewFilter - это использование приложений AJAX и javascript. Если вы используете javascript для рендеринга гридов или определенных компонентов пользовательского интерфейса, происходит ленивая загрузка (учитывая, что вы включили фильтр), и возникает исключение. Рендеринг пользовательского интерфейса вашего приложения идет наперекосяк. Данные могут никогда не появиться, страница начинает бросать странные исключения javascript, для обработки которых вам нужно написать дополнительный js-код. И вы открываете исключения db для пользователей (не самая лучшая идея).

В обычном приложении эти исключения можно перехватить и бросить корректное пользовательское исключение.

4
ответ дан 27 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: