2012-05-30 2 views
0

Я использую Hibernate только с кешем L1 (Session). Мне было интересно, можно ли его предварительно заполнить.Предварительно заполненный кэш Hibernate L1

Предположим, у меня есть Item таблицу, в которой каждый элемент имеет свой собственный id, и мне нужно выдавать запросы, как «from Item where id = :id»: если бы я мог предварительно загружать все детали на один раз я мог бы быстрее время отклика (I» m, используя Hibernate из сервлета под Tomcat).

+0

Кэш сеанса - это очень недолговечный кеш, чье жизненное время, как правило, является временем жизни одной транзакции: несколько миллисекунд и не разделяется между несколькими параллельными потоками. Если вам нужно получить почти все свои элементы по ID в транзакции, то да, вы можете предварительно загрузить все элементы. В противном случае я не вижу смысла. –

+0

Чтение этой статьи (https://community.jboss.org/wiki/UsingHibernateWithTomcat), я понял, что нужно оставить сеанс открытым для всего жизненного цикла сервлета, который может длиться намного больше, чем несколько секунд ... – cdarwin

+0

Я не могу получить доступ к этой статье, но вот что говорит официальная документация спящего режима о сеансе: * Однопоточный, короткоживущий объект, представляющий собой разговор между приложением и постоянным хранилищем. Обертывает JDBC java.sql.Connection. * –

ответ

-1

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

Но в этом случае у вас нет контроля, если сам сеанс выбрасывает предварительно загруженные данные из его кеша (это не функциональная проблема, только проблема с производительностью, и у меня такое ощущение, что версия спящего режима, м, никогда не делает этого). Если вы хотите иметь полный контроль, вы сохраняете предварительно загруженные данные в статической переменной (экземпляр List или Map) и пишите службу, которая вместо этого считывает эту статическую переменную из базы данных. Кстати, в вашей среде доступ к этой статической переменной должен быть синхронизирован.

+4

Это очень опасная вещь, потому что вы можете вернуть устаревшие данные. Если вы хотите кэшировать элементы для нескольких сеансов/транзакций, вам лучше использовать кэш второго уровня Hibernate: он будет прозрачным и будет обновляться при изменении элемента. Зачем изобретать колесо? –

+0

Если он кэшируется только для чтения, это не опасно (обратите внимание на ленивую загрузку, т. Е. Загрузите все или не закрывайте сеанс). Модификации после закрытия сеанса невозможны, одновременные изменения разными потоками ни (все принадлежат одному сеансу, а сеанс спящего режима не является потокобезопасным). Но все это подразумевает вопрос, который был для кеша L1. – Johanna

+0

Я имел в виду ваш совет хранить предварительно загруженные данные в статическом списке или карте. Вам лучше использовать chache L2 вместо того, чтобы выполнять свои собственные. –

Смежные вопросы