【问题标题】:How to mark entites as cacheable如何将实体标记为可缓存
【发布时间】:2019-09-26 04:02:30
【问题描述】:

我有带有 JPA 实体、spring 存储库和 spring 服务的 java jar 库,现在我将这个库包含在项目中,我希望一些实体可以缓存(缓存在二级缓存中)并且不想更改库。

是否可以将 Cachemanager 配置为包含不属于 @Cacheable 市场的实体?

【问题讨论】:

    标签: java spring hibernate caching spring-data-jpa


    【解决方案1】:

    如果你对persistence.xml有控制权,可以添加

    <shared-cache-mode>ALL</shared-cache-mode>
    

    为一个持久化单元缓存所有实体或

    <shared-cache-mode>DISABLE_SELECTIVE</shared-cache-mode>
    

    为所有实体启用缓存,但标记为 @Cacheable(false) 的实体除外(另请参阅 https://docs.oracle.com/javaee/7/api/javax/persistence/SharedCacheMode.html

    【讨论】:

    • 这部分回答了我的问题,但是如何定义哪些实体类去缓存,哪些不去
    • AFAIK 除了通过注释之外,您无法选择性地启用或禁用缓存实体 - 要么使用 @Cacheable(false) 启用所有并禁用选定的实体,要么使用 @Cacheable(true) 禁用所有并启用选定的实体
    【解决方案2】:

    如果你想使用Hibernate的独立于会话的二级缓存,它可以被多个HibernateSession使用,你必须先激活它。

    先修改persistence.xml,所以添加:

    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    

    和属性:

    <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
    

    您可以选择ALL 缓存所有实体,NONE 不缓存任何实体,ENABLE SELECTIVE 选择将被缓存的实体,DISABLE SELECTIVE 选择不会被缓存的实体.首选ENABLE SELECTIVE,因为它要求您明确决定缓存哪些实体。

    使用 JPA @Cacheable 或 Hibernate @Cache 注释来注释您的实体。

    如果您使用共享缓存模式DISABLE SELECTIVE,您还可以使用@Cacheable (false) 注释从缓存中排除实体。

    Hibernate doesn't use the second-level cache with JPQL or criteria queries.
    

    如果你想使用查询缓存修改persistence.xml,那么添加属性:

    <property name="hibernate.cache.use_query_cache" value="true"/>
    <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
    

    并使用setCacheable(boolean b); 方法激活查询缓存,(例如):

    Session s = (Session) em.getDelegate(); 
    Query q = s.createQuery("SELECT b FROM Book b WHERE id = :id"); 
    q.setParameter("id", 1L); 
    q.setCacheable(true); 
    Book b = q.uniqueResult();
    

    Hibernate 现在将此查询的结果存储在查询缓存中。当您的下一个用例执行此查询时,Hibernate 会检查查询缓存是否包含给定参数值的结果。如果缓存包含匹配的记录,Hibernate 从那里获取查询结果。否则,它将执行查询并将其结果存储在缓存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多