在Hibernate中计算SQL语句

时间:2013-06-13 20:06:35

标签: java sql hibernate

我遇到了一些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

由于

2 个答案:

答案 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

功能

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

但还有更多内容,例如log4dbcjdbc-trace-wrapper等。