Как не потерять кэширование 1-го уровня Hibernate?

276
08 августа 2017, 14:17

Кэш 1-го уровня у Hibernate храниться в сессии, и с ее закрытием теряются и все данные которые в нем были. Встает вопрос: как задизайнить свой DAO слой что-бы не потерять это полезное свойство Hibernate? Получается что надо держать сессию открытой? Но когда-то же надо ее закрывать...

На пример вот такой DAO класс:

public class DAOImpl implements DAO {
    private final SessionFactory factory;
    public DAOImpl(final SessionFactory factory) {
        this.factory = factory;
    }
    public void addUser(final User user) {
        try (final Session session = factory.openSession()) {
            session.beginTransaction();
            session.save(user);
            session.getTransaction().commit();
        }
    }
    //... и остальные CRUD операции.
}

Тут вероятно воспользоваться преимеществами кеширования не получится. Каждый кто придет откроет новую сессию и закроет ее при выходе из метода.

Объясните пожалуйста на примере этого небольшого класса как сделать так, что-бы преимущества кэширования были использованы (для начала хоть как-то), но при этом и проблемы с брошенной не закрытой сессией тоже не было? Как в обычных типовых случаях такое решается? Спасибо.

Answer 1

Вы можете использовать кэш 2го уровня - он распространяется на фабрику сессий. По умолчанию - выключен. Для включения необходимо указать:

<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider"/>
    //или  в более старых версиях
    //<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>

1я строка указывать на конкретную реализацию кэша, популярные варианты:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

Подробнее: оф. документация, статья на хабре

READ ALSO
Не работает taglib в jsp страницах

Не работает taglib в jsp страницах

Добрый вечер! Использую java 14, Tomcat 4

337
Как связывать таблицы в Hibernate?

Как связывать таблицы в Hibernate?

Добрый день, в очередной раз попал в тупик и не знаю как быть, помогите плиззз есть две таблицы, использую spring и hibernate

306
Обработка EditText и передача в БД

Обработка EditText и передача в БД

Подскажите, как я могу считать данные с EditText и прогнать их через метод в другом классе?

295
Как разрешить ввод тэга &lt;i&gt; в TinyMCE

Как разрешить ввод тэга <i> в TinyMCE

В моей cms есть настройка с adminareasettingsricheditoradditionalsettings и значением settings

324