Java JDBC-SQL语句执行时间日志

Java JDBC-SQL语句执行时间日志,java,sql,jdbc,time,Java,Sql,Jdbc,Time,我需要在JavaEE应用程序中记录SQL执行时间(任何进一步的统计数据都是可选的) 事情是以一种更不标准的方式设置的:应用服务器上的Datasource服务于池JDBC连接 应用程序用于数据库访问的组合: 冬眠 SpringJDBCTemplate 它运行于: 玻璃鱼 甲骨文数据库 我知道:但在我看来,这些问题/答案已经过时了 到目前为止,我发现: 我可以选择纯Hibernate方法() 但在我的例子中,由于混合DB访问,这是不可行的 我可以使用一些定制的JDBC驱动程序 p6s

我需要在JavaEE应用程序中记录SQL执行时间(任何进一步的统计数据都是可选的)

事情是以一种更不标准的方式设置的:应用服务器上的Datasource服务于池JDBC连接

应用程序用于数据库访问的组合:

  • 冬眠
  • SpringJDBCTemplate
它运行于:

  • 玻璃鱼
  • 甲骨文数据库
我知道:但在我看来,这些问题/答案已经过时了

到目前为止,我发现:

  • 我可以选择纯Hibernate方法()
    • 但在我的例子中,由于混合DB访问,这是不可行的
  • 我可以使用一些定制的JDBC驱动程序
    • p6spy-但是项目似乎已经死了几年(上次提交是在3年前:)
    • log4jdbc-但是超过1年没有发布,并且源代码活动似乎是cca 6个月未触及()
    • 另一个2:log4jdbc-log4j2和log4jdbc混音——它们似乎还活着,但我不确定稳定性和广泛使用性
基于经验的建议非常受欢迎。


请注意,我对这样的答案感兴趣:我们正在使用XYZ,这是我们的经验,而不是我刚才在谷歌上搜索,感觉…

测量时间和记录似乎是AOP的工作。如果您正在使用EJB,一个简单的拦截器应该可以解决您的问题(例如)。如果它是Spring(从JDBCTemplate判断),请尝试Aspectj。

如果您想要精确的SQL执行时间,那么最好的选择是SQL跟踪。但是您希望将它放在JavaEE应用程序中,因此显然需要一个稍微精确的执行时间

以下是我的建议[我已经在代码中实现了它们]:

  • 如果您只是出于日志目的而需要它,那么就有适当的Log4j调试消息,这些消息将打印时间和日志条目

  • 我为我的应用程序实现了一个BatchLog表,用于记录操作的开始和结束时间。所以在您的情况下,它将是查询的开始和结束时间。现在,若它只是一个查询,那个么触发器可能会在这里有所帮助,或者您可以在运行查询之前和之后更新日志表。或者更好的方法是使用一个存储过程,它可以处理整个事情并提供更准确的数据


  • 好的,非常感谢你的回答。 最后,我决定使用P6Spy,并提供特定于我们场景的补丁


    此外,由于我相信P6spy填补的空白在这些天仍然存在,我决定参与它的开发()。请随时将您的问题或功能请求报告给:以使其适合您的需要。

    感谢您的想法,我一直在寻找一些可重用的组件,我可以在我的基础架构中“即插即用”。让我们看看是否有其他想法出现,我进行了更深入的检查,但EJB拦截器似乎不可行,我想记录SQL执行时间,如果EJB的执行时间远远高于此时间,则记录EJB的执行时间。另一方面,AspectJ可能适合我。