如何检查(调试)JPA查询是从缓存还是从数据库获取结果

时间:2016-07-18 13:54:23

标签: java jpa caching eclipselink

我有简单的JPA查询

  Query query = getEntityManager().createQuery("SELECT pn FROM ProductsNames pn"
            + " WHERE pn.languages = :language"
            + " ORDER BY pn.products.id ASC");
    query.setParameter("language", language);
  return query.getResultList();

如何检查这些方法的结果是从缓存返回对象列表还是直接从数据库返回?

在persistence.xml中的

我设置了以下参数:

 <property name="eclipselink.logging.level.sql" value="FINE"/>

所以在服务器的输出上我可以监视执行的查询(但我不确定 - 如果查询在输出上可见,这意味着查询被发送到数据库或者意味着查询被发送到entityManager并且entityManager决定使用缓存和以后发送的查询到数据库)。

那么我如何区分对象的结果来自:

  • 直接从数据库
  • 直接从缓存

我会感激帮助。

1 个答案:

答案 0 :(得分:3)

您可以启用Performance Monitoring

<property name="eclipselink.profiler" value="PerformanceMonitor"/>

因此,您可以多次执行查询并访问some cache statistics,例如查询点击缓存的次数:

Integer cacheHits = (Integer)((PerformanceMonitor)session.getProfiler())
    .getOperationTimings()
    .get(SessionProfiler.CacheHits);

如果您想在更复杂的场景中收集更多详细信息,PerformanceMonitor已经为您执行此操作:

  

性能监视器将输出累积统计信息的转储   每分钟到EclipseLink日志。

     

静力学包含三组信息:

     
      
  • 信息:作为常量信息数据的统计信息,例如   会话名称或登录时间。
  •   
  • 计数器:作为总操作的累积计数器的统计信息,例如缓存命中或查询执行。
  •   
  • 计时器:统计数据,是特定类型的操作,读取,写入,数据库操作的总时间(以纳秒为单位)的累积度量。统计信息通常按总计分组,也可以按查询类型,查询类和查询名称进行分组。
  •   
     

计数器和计时器通常记录为相同的操作,所以   每次操作的时间也可以计算。