Hibernate查询计数

时间:2012-04-02 23:54:22

标签: hibernate

有没有办法计算Hibernate在事务或线程内部完成的查询数量?我查看了Hibernate拦截器,但是我应该覆盖哪些API以增加计数器并不明显。我的目标是建立一个警报,以便在特定请求的查询计数超过某个阈值时通知我,因此我可以根据需要对其进行优化。

谢谢,

山姆

2 个答案:

答案 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();

等等......