【问题标题】:How to check (debug) if JPA query get result from cache or from database如何检查(调试)JPA 查询是否从缓存或数据库中获取结果
【发布时间】:2016-07-18 13:54:22
【问题描述】:

我有简单的 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 决定使用缓存,然后将查询发送到数据库)。

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

  • 直接来自数据库
  • 直接从缓存中

感谢您的帮助。

【问题讨论】:

  • 您的配置显示为 EclipseLink,但您的标签显示为 Hibernate。这将是特定于提供商的。

标签: java jpa caching eclipselink


【解决方案1】:

您可以启用Performance Monitoring:

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

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

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

如果您想在更复杂的场景中收集更多详细信息,PerformanceMonitor 已经为您做到了:

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

静态包含三组信息:

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

计数器和定时器一般是为相同的操作记录的,所以 每次操作的时间也可以计算出来。

【讨论】:

  • 你能详细说明在给定的 sn-p session.getProfiler() 中哪个会话以及在哪里导入或声明它
  • @Reenu,这是 Hibernate (JPA) 会话。如果您使用的是实体管理器,则可以使用entityManager.unwrap(Session.class); 获取会话。
  • 我正在尝试在#openliberty 中执行此操作,但原因是:java.lang.ClassNotFoundException: org.eclipse.persistence.tools.profiler.PerformanceMonitor。知道缺少什么吗?我实际上打印了我的参考,它是 PerformanceMonitor 类型的,但是投射它会产生异常。
猜你喜欢
  • 2010-12-23
  • 1970-01-01
  • 2010-09-22
  • 2011-01-09
  • 2018-02-18
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多