有没有办法计算Hibernate在事务或线程内部完成的查询数量?我查看了Hibernate拦截器,但是我应该覆盖哪些API以增加计数器并不明显。我的目标是建立一个警报,以便在特定请求的查询计数超过某个阈值时通知我,因此我可以根据需要对其进行优化。
谢谢,
山姆
答案 0 :(得分:3)
这个问题很老,但我认为它可以帮助其他人。
库Spring Hibernate Query Utils(https://github.com/yannbriancon/spring-hibernate-query-utils)为每个线程提供一个查询计数器,可以在集成测试中使用该计数器来检查每个请求生成的查询数。
自述文件中有一个示例:
...
import com.yannbriancon.interceptor.HibernateQueryInterceptor;
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class NotificationResourceIntTest {
@Autowired
private HibernateQueryInterceptor hibernateQueryInterceptor;
@Test
public void saveFile_isOk() throws Exception {
// Initialize the query to 0 and allow the counting
hibernateQueryInterceptor.startQueryCount();
// Call the resource that we want to test
MvcResult result = mvc.perform(get("/rest/notifications"))
.andExpect(status().isOk())
.andReturn();
// Get the query count for this thread and check that it is equal to the number of query you expect, let's say 4.
// The count is checked and we detect potential n+1 queries.
Assertions.assertThat(hibernateQueryInterceptor.getQueryCount()).isEqualTo(4);
}
}
答案 1 :(得分:1)
这篇文章对你有帮助吗?
http://www.javalobby.org/java/forums/t19807.html
您可以执行以下操作:
SessionFactory sessionFactory = getSessionFactoryForApplication();
Statistics stats = sessionFactory.getStatistics();
stats.setStatisticsEnabled(true);
// All of the queries that have executed.
String[] queries = stats.getQueries();
等等......