Hibernate 5 Кэш второго уровня не работает, все еще загружается из базы данных - PullRequest
0 голосов
/ 08 февраля 2019

Я планирую внедрить кэш второго уровня в Hibernate 5. Класс Entity аннотирован @Cacheable и добавлена ​​стратегия CacheConcurrencyStrategy.READ_WRITE.но он все еще ищет данные в базе данных вместо кэша. В журналах показаны 2 запроса SQL.

Пожалуйста, ознакомьтесь с моим основным методом

public static void main(String[] args) {
    HolidayDAOImpl holidayImpl = new HolidayDAOImpl();
    holidayImpl.setSessionFactory(HibernateUtil.INSTANCE.getSessionFactoryInstance());
    holidayImpl.load().forEach(System.out :: println);
    System.out.println("Loading second time");
    holidayImpl.load().forEach(System.out::println);
}   

Пожалуйста, посмотрите перечисление HibernateUtil

public enum HibernateUtil{
INSTANCE;

public SessionFactory getSessionFactoryInstance(){  
    Properties properties = new Properties();
    properties.setProperty(Environment.URL, "jdbc:mysql://dummy");
    properties.setProperty(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect");
    properties.setProperty(Environment.DRIVER, "com.mysql.jdbc.Driver");
    properties.setProperty(Environment.USER, "demo");
    properties.setProperty(Environment.PASS, "demo");

    //second level cache prop

    properties.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "true");
    properties.setProperty(Environment.USE_QUERY_CACHE, "true");
    properties.setProperty(Environment.CACHE_REGION_FACTORY, "org.hibernate.cache.ehcache.EhCacheRegionFactory");

    //logging

    properties.setProperty("hibernate.show_sql","true");
    properties.setProperty("hibernate.format_sql","true");

    Configuration cfg = new Configuration();
    cfg.setProperties(properties);
    cfg.addAnnotatedClass(Holidays.class);
    StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
    SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
    return sessionFactory;
}
}

Пожалуйста, смотрите класс DAOImpl

public List<Holidays> load() {
    try (Session session = sessionFactory.openSession()) {

        //List<Holidays> result = session.createQuery("from Holidays", Holidays.class).getResultList();
        Criteria criteria  = session.createCriteria(Holidays.class);
        criteria.add(Restrictions.like("holiday_name", "%QA%"));

        return criteria.list();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

pom.xml

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>5.4.1.Final</version>
    </dependency>
</dependencies>

Проходя через некоторые ответы о переполнении стека, может понять, что в последней версии Hibernate (после версии 4), есть некоторые изменения в конфигурации.Не уверен, что я допустил какую-либо ошибку в конфигурации.

Может ли кто-нибудь взглянуть на это и выяснить, почему он все еще ищет базу данных вместо кэша?

1 Ответ

0 голосов
/ 11 февраля 2019

Для использования кэша запросов Hibernate необходимо добавить setCacheable (true) в каждый запрос.

Если вы добавите criteria.setCacheable (true); в класс DAOImpl, второй результат запроса будет получен из кэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...