【问题标题】:Does spring-data-jpa has a L2 cache implementation?spring-data-jpa 是否有 L2 缓存实现?
【发布时间】:2018-04-10 10:59:37
【问题描述】:

我正在尝试以最少的设置创建具有二级缓存的存储库。我的数据库是postgresql。

我从使用 maven 的 spring-boot-sample-data-jpa-archetype 项目开始。 我已经删除了 HSQL 并创建了一个 DataSource bean 来连接到 postgresql。 也可以使用 ddl 创建 schema 并导入初始脚本数据。

我还将@Cacheable 添加到我的实体中。 然后我使用单元测试使用存储库查询一个实体 10 次。耗时1~49ms。所以这给我留下了两个问题。

  1. 存储库是否受益于 L1 缓存?我如何知道我是在访问缓存还是数据源?
  2. 如何开启二级缓存? Spring数据有自己的实现吗?

【问题讨论】:

  • Spring Data JPA 只是 JPA 的一个包装器。如果你想使用 L2 缓存,它完全取决于使用的 JPA 实现(在 Spring Boot 中默认为 Hibernate)。
  • @dunni Java 8 有捆绑 JPA 实现吗?
  • 没有。 JPA 不是 JDK 的一部分

标签: java caching spring-data-jpa


【解决方案1】:

经过一些测试和@dunni 的帮助,我会回答我自己的问题。 Spring 使用 Hibernate 作为 JPA 的实现。 Spring 数据为 Hibernate 提供了一些包装器。还需要选择一个缓存实现。

要启用 L2 缓存,请将这些属性添加到您的项目中。

  1. spring.jpa.properties.hibernate.cache.use_second_level_cache=true
  2. spring.jpa.properties.hibernate.cache.use_query_cache=true
  3. spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

还添加这些依赖项: 休眠-ehcache

然后,将@Cacheable(true) 添加到您的实体模型类。 扩展存储库接口,Spring 将使用命名约定生成实现。例如

@QueryHints({@QueryHint(name="org.hibernate.cacheable", value="true")})
Entity findByName(String name)

您也可以实现该接口。但这需要向查询对象添加提示以激活 L2 缓存。

query.setHint("org.hibernate.cacheable", true);

要验证缓存是否正常工作,可以使用以下属性查看 SQL 是否已执行。

  1. spring.jpa.show-sql=true
  2. spring.jpa.properties.hibernate.format_sql=true

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 2017-11-22
    • 1970-01-01
    • 2011-06-10
    • 2015-02-13
    • 2016-12-30
    • 1970-01-01
    • 2017-06-01
    • 2013-05-09
    相关资源
    最近更新 更多