【发布时间】: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