【问题标题】:monitor JDBC calls [closed]监控 JDBC 调用 [关闭]
【发布时间】:2016-01-25 10:41:56
【问题描述】:

我有一个 Java 应用程序,它连接到 Postgres 数据库并发出一些 SQL 语句。我想监视连接以获取有关每个查询执行速度的统计信息。我尝试过使用 JAMon (http://jamonapi.sourceforge.net/),但不是很了解它,发现文档非常缺乏。

这是我打开连接的方式:

Class.forName("com.jamonapi.proxy.JAMonDriver");
con = DriverManager.getConnection("jdbc:jamon:postgresql://localhost:5432/myDB?jamonrealdriver=org.postgresql.Driver", "user", "pw");

不过我没有注意到任何区别。一切仍然正常,所以我想这至少没有错误配置,但我没有得到任何地方的日志或任何东西。我还有什么需要设置的吗?

我也尝试添加这一行,但它也没有做任何事情:

con = MonProxyFactory.monitor(con);

所以基本上,我正在寻找的是一份完整且易于理解的初学者指南,用于使用 JAMon(甚至任何其他监控工具,只要它易于设置)监控 JDBC 调用。

注意:完成的程序应该在我没有不受限制的访问权限的远程数据库上运行,这意味着我无法编辑 postgresql.conf 或访问数据库的日志文件。这意味着我不能使用Can I log query execution time in PostgresSQL 8.4?的解决方案

我也尝试过使用 JDbMonitor (http://www.jdbmonitor.com/),我设法将它设置为监视器成功连接的点(它从 Java 应用程序找到了我打开的数据库连接),但没有显示任何查询/被它记录下来。所以对那个监视器有一点帮助也很好:D。

编辑:log4jdbc (https://github.com/arthurblake/log4jdbc) 是一个可行的选择吗?最新版本说它只适用于 Java 1.7,所以我不确定它是否会工作,但会在这里等待答案时尝试一下......

【问题讨论】:

  • Postgres 也有你知道的工具。
  • @Kayaman 我忘了提到,虽然我目前正在处理我的本地数据库,但该程序稍后需要在我无法访问日志文件或编辑 postgresql.conf 的远程数据库上运行。我会更新问题。
  • 您可以在DAO\Service方法上添加切入点(使用aspectj或spring-aop)并记录整个方法的执行时间(包括查询执行时间和获取结果的时间)。
  • @user1516873 我目前调用 Instant start = Instant.now();在任何方法的开头并记录 Duration.between(start, Instant.now());之后,但我认为这不是最好的方法。另外,它没有包含足够的详细信息(例如:它没有拆分查询 exec 和 fetch)。

标签: java postgresql jdbc monitoring


【解决方案1】:

可以使用 P6Spy

https://p6spy.github.io/p6spy/2.0/install.html

https://p6spy.readthedocs.io/en/latest/install.html

一旦与应用程序正确集成,它就会生成一个全面的日志。

【讨论】:

  • 这非常容易设置和配置,它目前正在以我想要的方式记录我需要的所有内容。也许我会在途中遇到限制,但就目前而言,这对我来说是最好和最简单的解决方案,谢谢!
  • 我实际上遇到了一个限制:我将一个文件作为 BLOB 插入到数据库中,但间谍只捕获最终的 INSERT 命令 ("INSERT INTO test(filename, file) VALUES (' test.pdf',27142)")... 实际创建和填充 LOB 的所有命令都没有记录!有什么方法也可以启用这些记录吗?
【解决方案2】:

我已经广泛使用 Log4jdbc,它运行良好。您只需要替换 jdbc 连接字符串并在您的类路径中有原始的 .jar 驱动程序文件,它就像一个魅力。如果你使用 SL4FJ 作为日志外观是必须的。

【讨论】:

  • 我按照cubrid.org/analyzing_jdbc_logs 上的教程进行操作(即使我使用的是 NetBeans,但无论如何),我不断收到“log4j:WARN No appenders could be found for logger (myProj.PostgresCon)”。 .我一般理解警告(没有为此类定义附加程序),但并不真正了解如何将附加程序从我的 log4j.xml 文件添加到我的类记录器。
  • 这是因为您使用 Log4j 作为日志框架。 Log4jdbc 使用 SL4FJ。您应该从类路径中替换 Log4j jar 并添加 log4j-over-slf4j。然后你只需要在你的类路径的根目录下创建一个logback.xml 文件(如果你使用的是 Maven,则为 src/main/resource)。
  • 我设法设置了日志记录,但仍然有两个问题:1)日志只是写入控制台,而不是指定文件。 2)我有时需要将我的连接强制转换为 PGConnection(用于 LOB 支持),但出现以下错误:“net.sf.log4jdbc.ConnectionSpy 无法强制转换为 org.postgresql.PGConnection”... 有什么办法可以解决这个?
  • 关于记录到文件,你必须设置一个file appender in your logback.xml。您显然可以从调用 getRealConnection() 的 ConnectionSpy 对象中解开连接
  • 啊,好吧,完全错过了 getRealConnection(),抱歉,但如果我调用它,它显然不会记录任何 LOB 处理查询。另外,我在 logback.xml 中定义了 FileAppender(按照链接中的 tut),但它仍然没有记录到文件(ConsoleAppender 工作正常)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 2014-07-25
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多