7

我在使用休眠时遇到了一些性能问题,因为它多次访问数据库。我正在研究一些获取策略。我想编写一些功能单元测试,以便随着我的应用程序的发展,我可以看到正在调用多少 SQL 语句。

我想知道我是否可以计算出调用了多少条 SQL 语句。目前我将 show-sql 设置为 true,然后在控制台中计算 SQL。如果可能的话,我想在代码中做到这一点。是否可以计算有多少 SQL 休眠在代码中使用数据库?

谢谢

编辑

在@Aleksander Blomskø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 及其许多相关类。所以实际上我想知道由于“from MyType”调用而影响数据库的所有 SQL。

我的要求更清楚吗?还是我只是滥用 StatisticService

谢谢

4

2 回答 2

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());
于 2013-06-13T20:14:16.027 回答
3

您可以尝试一些 JDBC 包装器/代理工具包。

这个看起来很有希望完成您的任务:JDBC Spy

特征

  • 记录所有SQL语句的执行和迭代时间
  • 识别多次执行的语句
  • 所有列出的语句的具有可配置深度的堆栈跟踪
  • 提供所有连接、SQL 语句、结果集的统计信息
  • 提供结果集的大小
  • 提供一个 API 来检索所有统计信息
  • 列出当前正在执行的所有语句
  • 列出所有已执行但尚未关闭的语句
  • 如果语句的执行时间超过可配置的阈值,则通知(例如通过跟踪)
  • 通知您是否忘记关闭结果集或连接关闭之前的语句
  • 支持不同的记录器(log4j,java logging,slf,...)
  • 可由自定义侦听器扩展

但还有更多,比如log4dbcjdbc-trace-wrapper等。

于 2013-06-13T20:20:14.427 回答