我遇到了一些hibernate的性能问题,因为它会多次访问数据库。我正在研究一些获取策略。我想编写一些功能单元测试,以便随着我的应用程序的发展,我可以看到有多少SQL语句被调用。
我想知道我是否可以计算调用多少个SQL语句。目前我将show-sql设置为true,然后计算控制台中的SQL。如果可能的话,我想在代码中执行此操作。是否可以计算hibernate在代码中使用数据库的数量?
由于
修改
@AleksanderBlomskøld回复后......
我的测试用例是
StatisticsService statisticsService = new StatisticsService();
Session session = entityManager.unwrap(Session.class);
statisticsService.setSessionFactory(session.getSessionFactory());
statisticsService.setStatisticsEnabled(true);
List<MyType> r= entityManager.createQuery("from MyType", MyType.class).getResultList();
System.out.println(statisticsService.getQueryExecutionCount());
System.out.println(statisticsService.getQueries()[0]);
查询执行计数为1,如果我查看查询,则说它是“来自MyType”
然而,在日志中的sql语句中,我可以看到有SQL语句来检索MyType及其许多相关类。所以实际上我想知道因为“来自MyType”调用而攻击数据库的所有SQL。
我需要更清楚吗?或者我只是滥用StatisticService
由于
答案 0 :(得分:8)
在Hibernate中启用统计信息并使用统计服务。配置会话工厂时,请确保设置hibernate.generate_statistics = true。然后,您可以通过JMX或以编程方式访问统计信息:
//Enable statistics
StatisticsService statisticsService = new StatisticsService();
statisticsService.setSessionFactory(sessionFactory);
statisticsService.setStatisticsEnabled(true);
// Do queries...
//...
///Print out stats:
System.out.println(statisticsService.getQueryExecutionCount());
答案 1 :(得分:3)
您可以尝试一些JDBC包装器/代理工具包。
这个看起来很有希望完成你的任务:JDBC Spy。
功能强>
但还有更多内容,例如log4dbc,jdbc-trace-wrapper等。