Java 统计Hibernate中的SQL语句

Java 统计Hibernate中的SQL语句,java,sql,hibernate,Java,Sql,Hibernate,我对hibernate有一些性能问题,因为它对数据库的访问次数太多了。我正在调查一些获取策略。我想编写一些功能单元测试,以便随着应用程序的发展,我可以看到调用了多少SQL语句 我想知道是否可以计算调用了多少SQL语句。目前,我正在将showsql设置为true,然后计算控制台中的sql。如果可能的话,我想用代码来做这件事。是否可以计算代码中有多少SQL hibernate访问数据库 谢谢 编辑 在@Aleksander Blomskøld回复之后 我的测试用例是 StatisticsServic

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

我想知道是否可以计算调用了多少SQL语句。目前,我正在将showsql设置为true,然后计算控制台中的sql。如果可能的话,我想用代码来做这件事。是否可以计算代码中有多少SQL hibernate访问数据库

谢谢

编辑

在@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]);
StatisticsService StatisticsService=新的StatisticsService();
Session Session=entityManager.unwrap(Session.class);
statisticsService.setSessionFactory(session.getSessionFactory());
statisticsService.setStatisticsEnabled(真);
List r=entityManager.createQuery(“来自MyType”,MyType.class).getResultList();
System.out.println(statisticsService.getQueryExecutionCount());
System.out.println(statisticsService.getQueries()[0]);
查询执行计数为1,如果我查看查询,它会说它是“来自MyType”

然而,在日志中的sql语句中,我可以看到有sql语句用于检索MyType及其许多相关类。所以事实上,我想知道由于“fromMyType”调用而影响数据库的所有SQL

我需要的更清楚吗?还是我只是误用了统计服务


谢谢

在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());

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

这一个看起来很适合您的任务:

功能

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

但是还有很多方法,比如,等等。

与“计算SQL”相比,您的数据库可能有更好的方法在这方面获得启发。我想你的意思是“计数SQL语句”BTW.TURE @ TIETYT它是声明-更新了代码也许你可以考虑NPROF?Hi @ Aleksander,我不确定这是我想要的。我已经更新了问题…差不多了,谢谢