【问题标题】:JDBC - SQL statements execution time loggingJDBC - SQL 语句执行时间记录
【发布时间】:2013-08-18 15:44:28
【问题描述】:

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

以更不标准的方式进行设置:应用程序服务器上的数据源为池化 JDBC 连接提供服务。

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

  • 休眠和
  • Spring JDBC模板

它运行在:

  • Glassfish OSE 和
  • Oracle DBS

我知道:Anything better than P6Spy? 但是从我的角度来看,问题/答案已经过时了。

到目前为止我发现了什么:

非常欢迎根据经验提出建议。

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

【问题讨论】:

    标签: java sql jdbc time


    【解决方案1】:

    如果您想要精确的 SQL 执行时间,那么最好的选择是 sql trace。但是你想把它放在你的 Java EE 应用程序中,所以显然需要一个准确的执行时间。

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

    1. 如果您只是希望它用于登录目的,那么请使用适当的 Log4j 调试消息,这些消息将与日志条目一起打印时间。

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

    【讨论】:

      【解决方案2】:

      测量时间并记录它似乎是 AOP 的工作。如果您使用 EJB,一个简单的拦截器应该可以解决您的问题(例如 http://www.javacodegeeks.com/2013/07/java-ee-ejb-interceptors-tutorial-and-example.html)。如果是 Spring(从 JDBCTemplate 判断),试试 Aspectj。

      【讨论】:

      • 感谢您的想法,我宁愿寻找一些可重用的组件,我可以“即插即用”到我的基础架构中。让我们看看是否有其他想法出现
      • 好吧,我检查得更深入了,但 EJB 拦截器似乎不可行,我想记录 SQL 执行时间,如果 EJB 远高于此时间。另一方面,AspectJ 可能对我有用。
      【解决方案3】:

      好的,非常感谢您的回答。 最后,我决定选择 P6Spy,并使用特定于我们场景的补丁。

      此外,由于我相信 P6spy 正在填补的空白这些天仍然存在,我决定参与它的开发 (https://github.com/p6spy/p6spy)。随时将您的问题或功能请求报告至:https://github.com/p6spy/p6spy/issues,以使其满足您的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 2015-10-31
        • 2012-08-09
        • 2014-12-16
        • 1970-01-01
        • 2015-01-19
        相关资源
        最近更新 更多