【问题标题】:Hibernate 2nd level cache not working with GORM 6.1.11休眠二级缓存不适用于 GORM 6.1.11
【发布时间】:2020-01-05 23:39:00
【问题描述】:

问题:

我有一个条件查询,其中 Hibernate 的二级缓存用于使用 cache(true)

User user = User.createCriteria().get {
    eq("id", 1l)
    cache(true)
}

当此代码被命中两次时,第一次它会进行预期的数据库查询,但是当下一次执行相同的代码时,它不应该命中数据库以进行查询,而是应该从缓存中获取它。但这并没有发生。

日志:

2019-08-29 23:25:06.023 DEBUG --- [nio-8080-exec-1] o.h.cache.internal.StandardQueryCache    : Checking cached query results in region: org.hibernate.cache.internal.StandardQueryCache
2019-08-29 23:25:06.023 DEBUG --- [nio-8080-exec-1] o.h.c.e.i.r.EhcacheGeneralDataRegion     : key: sql: select this_.id as id1_0_0_, this_.version as version2_0_0_, this_.first_name as first_na3_0_0_, this_.last_name as last_nam4_0_0_, this_.email as email5_0_0_ from user this_ where this_.id=?; parameters: 1, ; transformer: org.hibernate.transform.CacheableResultTransformer@110f2
2019-08-29 23:25:06.027 DEBUG --- [nio-8080-exec-1] o.h.c.e.i.r.EhcacheGeneralDataRegion     : Element for key sql: select this_.id as id1_0_0_, this_.version as version2_0_0_, this_.first_name as first_na3_0_0_, this_.last_name as last_nam4_0_0_, this_.email as email5_0_0_ from user this_ where this_.id=?; parameters: 1, ; transformer: org.hibernate.transform.CacheableResultTransformer@110f2 is null
2019-08-29 23:25:06.028 DEBUG --- [nio-8080-exec-1] o.h.cache.internal.StandardQueryCache    : Query results were not found in cache
2019-08-29 23:25:06.030 DEBUG --- [nio-8080-exec-1] org.hibernate.SQL                        : select this_.id as id1_0_0_, this_.version as version2_0_0_, this_.first_name as first_na3_0_0_, this_.last_name as last_nam4_0_0_, this_.email as email5_0_0_ from user this_ where this_.id=?
2019-08-29 23:25:06.046 DEBUG --- [nio-8080-exec-1] o.h.s.internal.ConcurrentStatisticsImpl  : HHH000117: HQL: [CRITERIA] select this_.id as id1_0_0_, this_.version as version2_0_0_, this_.first_name as first_na3_0_0_, this_.last_name as last_nam4_0_0_, this_.email as email5_0_0_ from user this_ where this_.id=?, time: 17ms, rows: 1
2019-08-29 23:25:06.047 DEBUG --- [nio-8080-exec-1] o.h.cache.internal.StandardQueryCache    : Caching query results in region: org.hibernate.cache.internal.StandardQueryCache; timestamp=6418846948913152
2019-08-29 23:25:06.049 DEBUG --- [nio-8080-exec-1] o.h.c.e.i.r.EhcacheGeneralDataRegion     : key: sql: select this_.id as id1_0_0_, this_.version as version2_0_0_, this_.first_name as first_na3_0_0_, this_.last_name as last_nam4_0_0_, this_.email as email5_0_0_ from user this_ where this_.id=?; parameters: 1, ; transformer: org.hibernate.transform.CacheableResultTransformer@110f2 value: [6418846948913152, 1]
Found com.wizpanda.test.User : 1
2019-08-29 23:25:06.099  INFO --- [nio-8080-exec-1] i.StatisticalLoggingSessionEventListener : Session Metrics {
    45071 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    3767346 nanoseconds spent preparing 1 JDBC statements;
    4620558 nanoseconds spent executing 1 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    7925151 nanoseconds spent performing 1 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    4562453 nanoseconds spent performing 1 L2C misses;
    0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)
}

环境:

  • 操作系统:MacOS、CentOS7
  • GORM 版本: 6.1.11
  • Grails 版本(如果使用 Grails): 3.3.9
  • JDK 版本: 1.8.0_91

重现步骤:

  1. 克隆这个repogit clone git@github.com:wizpanda/test-l2-cache.git
  2. 登录MySQL数据库并新建数据库create database test_l2_cache
  3. 更改grails-app/conf/application.yml中的MySQL用户名和密码
  4. 运行应用程序grails run-app./gradlew bootRun
  5. 浏览至http://localhost:8080/ 并查看日志

提出的问题:https://github.com/grails/grails-data-mapping/issues/1266

【问题讨论】:

    标签: hibernate caching grails grails-orm hibernate-cache


    【解决方案1】:

    作为第一步,您需要启用 Hibernate 的二级缓存,如下所示:

    hibernate.cache.use_second_level_cache=true
    

    这样,您只为实体而不是查询启用了二级缓存。

    如果您需要在查询/条件级别进行缓存:

    在 Hibernate API 中:query.setCacheable(true); //query is instance of org.hibernate.Query

    在 JPA 中:query.setHint("org.hibernate.cacheable", true) //query is instance of javax.persistence.Query

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 2016-06-23
    • 2019-04-02
    • 2017-07-05
    • 2011-07-08
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多