我们正在使用Sping Boot with Hibernate连接postgresql数据库,并注意到一些查询比预期的要慢得多。有什么好的工具或方法来找出为什么会发生这种情况吗?我们正在使用Sentry,所以我对哪些语句是问题有一些见解,例如:
我们可以看到,BookingLegRepository.findByStartTimewindowStartBetweenAndDistributorId
需要很长时间,而其他存储库的获取速度相当快。ScheduledLegRepository.findByStartTimeBetweenAndAssignment_Distributor_Id
获取的对象数量与BookingLegRepository.findByStartTimewindowStartBetweenAndDistributorId
相似。
现在,我想知道这是否是因为查询没有被有效地定义:
@Query("select b from BookingLegEntity b left join fetch b.belongsTo where b.startTimewindowStart between ?1 and ?2 and b.distributor.id = ?3")
List<BookingLegEntity> findByStartTimewindowStartBetweenAndDistributorId(Instant from, Instant to, UUID distributorId);
或者这是因为Hibernate在后台进行的一些缓存使得后续调用更快(scheduled-leg和booking-leg彼此关联)。
而且,我无法想象数据库本身是查询速度慢的原因,所以我一直在想是不是Hibernate创建Java对象花费了太多时间。
有没有什么好办法可以让我们更好地了解我们的问题?
1条答案
按热度按时间f0brbegy1#
有没有什么好办法可以让我们更好地了解我们的问题?
当然,第一步是记录Hibernate执行的实际SQL,或者通过设置属性:
或者将日志类别
org.hibernate.SQL
设置为debug
。您绝对不可能通过将Spring存储库当作黑盒来分析数据访问代码的性能,任何Java监视或分析工具也不可能非常有用,因为您真正需要做的是最小化到数据库服务器的往返。