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

Mic*_*ski 7 java caching jpa 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();
Run Code Online (Sandbox Code Playgroud)

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

在persistence.xml中,我设置了以下参数:

 <property name="eclipselink.logging.level.sql" value="FINE"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

我将不胜感激。

Dhe*_*rik 5

您可以启用性能监控

<property name="eclipselink.profiler" value="PerformanceMonitor"/>
Run Code Online (Sandbox Code Playgroud)

因此,您可以根据需要多次执行查询并访问一些缓存统计信息,例如查询命中缓存的次数:

Integer cacheHits = (Integer)((PerformanceMonitor)session.getProfiler())
    .getOperationTimings()
    .get(SessionProfiler.CacheHits);
Run Code Online (Sandbox Code Playgroud)

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

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

静态包含三组信息:

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

计数器和定时器通常记录相同的操作,因此也可以计算每个操作的时间。