我有一个看起来像这样的简单存储库
public interface PlayerLevelRepository extends CrudRepository<PlayerLevel, Integer> {
@Query("FROM PlayerLevel WHERE exp <= :exp ORDER BY exp DESC")
List<PlayerLevel> findClosestToExperienceLevel(@Param("exp") long exp);
}
我正在分析休息时间的响应时间,并发现第一次休息执行速度比下一次慢十倍。
所以我决定检查一下存储库方法的时间(我没有任何其他耗时的操作),就像这样
@Override
public int findClosestLevel(long exp) {
long startTime = System.nanoTime();
int closestLevel = levelRepository.findClosestToExperienceLevel(exp).get(0).getLevel();
long endTime = System.nanoTime();
LOGGER.info("Execution time: {}", endTime - startTime);
return closestLevel;
}
我看到第一次调用花费35012440
aka 35 ms
。第二次,第三次和其他调用时间减少十倍 - 2194712
或2ms
,3058421
或3ms
等等。
我的问题是 - Spring Data JPA
缓存查询结果的东西吗?
Spring Data JPA“仅仅”是JPA的一个包装器(或者很好的外观),因此在下面你仍然具有标准的JPA功能。你在EntityManager
/ Session
级别有1lvl缓存,在EntityManagerFactory
/ SessionFactory
级别有2lvl缓存。有更多类型的缓存,如:查询结果缓存等。您可以阅读更多关于它们here(它是旧的Hibernate版本,但它应该仍然有效)。