Будьте в спящем режиме кэширование JPA

У меня есть таблица по имени Master_Info_tbl. Это - справочная таблица:

Вот код для таблицы:

 @Entity
@Table(name="MASTER_INFO_T")
 public class CodeValue  implements java.io.Serializable {
 private static final long serialVersionUID = -3732397626260983394L;
 private Integer objectid;
 private String codetype;
 private String code;
 private String shortdesc;
 private String longdesc;
 private Integer dptid;
 private Integer sequen;
 private Timestamp begindate;
 private Timestamp enddate;
 private String username;
 private Timestamp rowlastchange;
 //getter Setter methods

У меня есть уровень служб, который называет метод
      
service.findbycodeType ("Code1");


  тем же путем эта таблица запрашивается для других типов кода также, например, code2, code3 и так далее до code10, который получает набор результатов от той же таблицы и показан в выпадающие из jsp страниц, так как эти холмы отбрасывания находятся на 90% страниц, я думаю для кэширования их глобально.

Какая-либо идея, как достигнуть этого?

К вашему сведению: Я использую JPA и В спящем режиме с Struts2 и Spring. Используемой базой данных является DB2 UDB8.2


@Pascal
Большое спасибо за все Ваши ответы. Это помогло мне много. Я реализовал все, что я предположил для реализации (я Думаю). Тем не менее я не знаю, работает ли второе кэширование уровня или нет. Так как я не могу видеть что-либо во входе в систему файла входа log4j от кэша, и также ничто не обнаруживается в консоли. Чтобы показать, что вторая реализация кэша уровня работает, у меня должны быть некоторое доказательство и потребность показать его моему менеджеру. Таким образом, я отчасти застреваю.
Помогите!
Я знаю, что я очень близко к, заканчивают его, но просто....
Вот мой код (если Вы думаете, что что-то отсутствует, или что-то не должно быть там, сообщите мне):
Класс объекта

@Entity
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "CODEVALUE_T")
public class CodeValue implements java.io.Serializable {
//all the field name with getter and setter
}

Persistence.xml:

<properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.cache.use_second_level_cache" value="true"/>
            <property name="hibernate.cache.use_query_cache" value="true"/>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
        </properties>

ДАО уровня служб:

try {
            System.out.println("Calling the findByCodetype() method");
            final String queryString = "select model from CodeValue model where model.codetype"
                    + "= :propertyValue" + " order by model.code";

            Query query = em.createQuery(queryString);
            query.setHint("org.hibernate.cacheable", true);
            query.setParameter("propertyValue", propertyName);
            return query.getResultList();

        } catch (RuntimeException re) {
            logger.error("findByCodetype failed: ", re);
            throw re;
        }

Значение Log4j.property для показа подробного
log4j.category.org.hibernate.cache=DEBUG

Код ehcache.xml (Это - местоположение, находится в src/папке то же место, где мой файл struts.xml расположен),

<ehcache>
   <diskStore path="java.io.tmpdir"/>
   <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="6000"
        timeToLiveSeconds="12000"
        overflowToDisk="true"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120"
        />

</ehcache>
5
задан Gus 7 December 2016 в 21:33
поделиться

2 ответа

Взгляните на функцию кеша запросов гибернации .

Вы также можете использовать легкое автономное решение для кэширования, например OSCache . Это дает вам полный контроль над тем, что, когда и как кэшируется, но вам также нужно подумать, когда обновлять кеш.

0
ответ дан 18 December 2019 в 09:48
поделиться

(...) поскольку эти выпадающие списки находятся на 90% страниц, я думаю кэшировать их глобально.

Использование кэша запросов было бы очень подходящим для этого варианта использования. Итак, активируйте кеш второго уровня , кешируйте объект CodeValue (см. 2.2.8. Кэширование объектов ) и поместите запрос позади findbycodeType в кэше запросов . Для этого используйте:

javax.persistence.Query query = manager.createQuery(...);
query.setHint("org.hibernate.cacheable", true);

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

*--------------------------------------------------------------------------*
|                              Query Cache                                 |
|--------------------------------------------------------------------------|
| [ "from CodeValue c where c.codetype=?", ["Code1"] ] -> [ 1, 2, ... ]    |
| [ "from CodeValue c where c.codetype=?", ["Code2"] ] -> [ 3, 5, 6, ... ] |
*--------------------------------------------------------------------------*

Таким образом, вызов вашего метода с другими аргументами не будет «сбрасывать предыдущие данные», аргумент является частью ключа (или кеш запроса не будет работать).

Обратите внимание, что это специфично для Hibernate, JPA 1.0 не определяет кэш второго уровня и кеширование запросов.

См. Также

13
ответ дан 18 December 2019 в 09:48
поделиться
Другие вопросы по тегам:

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