Кэширование с помощью Echache гибернации

#hibernate #caching #orm #jpa-2.0 #ehcache

#гибернация #кэширование #orm #jpa-2.0 #ehcache

Вопрос:

Привет, в моем приложении у меня есть несколько небольших таблиц, и я кэширую их все при запуске сервера на карте. Я хочу реализовать ту же функциональность с помощью комбинации Ecache hibernate

мой класс выглядит следующим образом

   @Entity
  @Table(name = "Order")
  @NamedQueries
  ({
     @NamedQuery(name="Order.findBySource", 
        query="from Order a where a.source = :source"),

     @NamedQuery(name="Order.findByAll", 
        query="from Order"),

     @NamedQuery(name="Order.findByPrioritySource", 
        query="from Order a where a.priority = :priority and a.source =   :source"),

     @NamedQuery(name="Order.findByPriority", 
        query="from Order a where a.priority = :priority"),

     @NamedQuery(name="Order.findByWhenModified", 
        query="from Order a where a.whenModified = :whenModified")
     })
      @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

    public class Order implements java.io.Serializable {

      private String source;
      private long priority;
      private Date whenModified;
    }
  

в этой таблице заказов едва ли 10 записей, и я хочу постоянно хранить эту таблицу в памяти.
есть идеи, как я могу этого добиться?

я запускаю вышеуказанные запросы для получения заказов. Я не хочу снова и снова обращаться к базе данных при запуске этого запроса, поэтому для этого в ecache.xml нужно ли мне создавать запись этого класса? или мне нужно кэшировать эти именованные запросы в ecache.xml ?

возможно ли воспроизвести реализацию Map с помощью Ehcache? чтобы я мог получить объект, просто указав идентификатор из кэша, не обращаясь к базе данных снова и снова?

Ответ №1:

Что вам нужно, так это кэш запросов гибернации. Прежде всего, вам нужно включить его на уровне гибернации, установив для свойства hibernate.cache.use_query_cache значение true. Затем, когда вы выполняете свой запрос в коде, вам нужно установить флаг для объекта запроса, чтобы указать, что он требует кэширования:

 Query q = session.getNamedQuery("Order.findByPriority");
q.setCacheable(true);
List result = q.list();
  

Комментарии:

1. Также смотрите ehcache.org/documentation/hibernate.html для правильной настройки кэша для работы с запросами. У меня возникли некоторые проблемы перед прочтением этого документа.