2

我有一个程序可以使用准备好的语句更新数据库中的表,并且我试图查看所有已实现的 SQL 语句的输出。

我的研究建议 P6Spy 看起来很棒,我下载了它,将 P6Spy.jar 作为依赖项添加到我的库中,修改为 spy.properties 文件以连接以使用 oracle 驱动程序作为真实驱动程序,将 spy.properties 添加到我的类路径,并在我的代码中将驱动程序更改为“com.p6spy.engine.spy.P6SpyDriver”。

一切正常,生成了 spy.log 文件,但它不包含 SQL 语句。相反,spy.log 文件中的输出是:

1374244954573|-1||debug||com.p6spy.engine.common.P6SpyOptions reloading properties
1374244954578|-1||info||Using properties file: C:\Users\gboss\logging\spy.properties
1374244954579|-1||info||No value in environment for: getStackTrace, using: false
1374244954579|-1||info||No value in environment for: getDeregisterDrivers, using: false
1374244954579|-1||info||No value in environment for: getUsePrefix, using: false
1374244954579|-1||info||No value in environment for: getExecutionThreshold, using: 0
1374244954579|-1||info||No value in environment for: getAutoflush, using: true
1374244954579|-1||info||No value in environment for: getExclude, using: 
1374244954579|-1||info||No value in environment for: getExcludecategories, using: info,debug,result,batch
1374244954579|-1||info||No value in environment for: getFilter, using: true
1374244954579|-1||info||No value in environment for: getInclude, using: 
1374244954579|-1||info||No value in environment for: getIncludecategories, using: 
1374244954579|-1||info||No value in environment for: getLogfile, using: c:/spy.log
1374244954579|-1||info||No value in environment for: getAppender, using: com.p6spy.engine.logging.appender.FileLogger
1374244954579|-1||info||No value in environment for: getRealdriver, using: oracle.jdbc.driver.OracleDriver
1374244954579|-1||info||No value in environment for: getRealdriver2, using: 
1374244954580|-1||info||No value in environment for: getRealdriver3, using: 
1374244954580|-1||info||No value in environment for: getAppend, using: true
1374244954580|-1||info||No value in environment for: getSpydriver, using: com.p6spy.engine.spy.P6SpyDriver
1374244954580|-1||info||No value in environment for: getDateformat, using: 
1374244954580|-1||info||No value in environment for: getDateformatter, using: null
1374244954580|-1||info||No value in environment for: getStringmatcher, using: com.p6spy.engine.common.SubstringMatcher
1374244954580|-1||info||No value in environment for: getStringMatcherEngine, using: com.p6spy.engine.common.SubstringMatcher@13aaa14a
1374244954580|-1||info||No value in environment for: getStackTraceClass, using: 
1374244954580|-1||info||No value in environment for: getSQLExpression, using: null
1374244954580|-1||info||No value in environment for: getReloadProperties, using: false
1374244954580|-1||info||No value in environment for: getReloadPropertiesInterval, using: 60
1374244954580|-1||info||No value in environment for: getJNDIContextFactory, using: null
1374244954580|-1||info||No value in environment for: getJNDIContextProviderURL, using: null
1374244954580|-1||info||No value in environment for: getJNDIContextCustom, using: null
1374244954580|-1||info||No value in environment for: getRealDataSource, using: null
1374244954580|-1||info||No value in environment for: getRealDataSourceClass, using: null
1374244954580|-1||info||No value in environment for: getRealDataSourceProperties, using: null

有没有人有使用 P6Spy 的经验并且知道问题是什么?我读过 spy.log 只是应该在完成我所做的所有事情并运行程序之后生成 sql 语句,所以我在这里很困惑

编辑——顺便更新了数据库,所以 SQL 语句确实通过并更新了数据库

4

2 回答 2

1

这通常是由于 P6SpyDriver 在您的真实 JDBC 驱动程序注册后注册到 DriverManager 引起的。P6Spy 1.3 不要求您更改 JDBC URL。当应用程序代码(或应用程序服务器)尝试从 DriverManager 获取合适的驱动程序时,它会循环访问已注册的驱动程序以找到第一个处理 URL 的驱动程序。如果 P6SpyDriver 没有在真正的驱动程序之前注册,那么它将不会被使用。

有两种方法可以解决此问题:

  1. 在 spy.properties 中设置“deregisterdrivers=true”。

这将导致 P6Spy 取消注册真正的驱动程序,然后重新注册它。这将导致 DriverManager 使用 P6SpyDriver。但是,对于 Java 6+,您必须确保为真实驱动程序列出的驱动程序类与将自动注册的驱动程序类匹配。您可以从 META-INF/services/java.sql.Driver 获取此类名称。如果 JDBC 驱动程序的 JAR 文件中不存在该文件,则它不支持自动注册。

  1. 在 spy.properties 中设置 'useprefix=true' 并修改 JDBC URL 以添加 'p6spy:' 前缀。

这将确保无论加载驱动程序的顺序如何,都将使用 P6SpyDriver。这其实是最靠谱的方法...

有关1.3 可用的各种配置选项,请参阅http://p6spy.github.io/p6spy/1.3/configandusage.html 。

于 2014-01-31T18:21:20.443 回答
1

我有同样的问题,我无法让它工作,所以我使用 log4jdbc 来拦截 JDBC 语句,它非常易于使用并且提供比 p6spy 更多的信息:

只需遵循以下两个简单步骤:

  1. 在您的 pom 文件中添加以下两个依赖项或将相应的 jars 添加到您的类路径:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>org.lazyluke</groupId>
        <artifactId>log4jdbc-remix</artifactId>
        <version>0.2.7</version>
    </dependency>
    
  2. 像这样更改您的 DB_URL 和 DB_DRIVER 属性,我使用的是 h2 数据库,所以我设置了以下属性:

    DB_DRIVER=org.h2.Driver DB_URL=jdbc:h2:./target/db/notificationdb;AUTO_SERVER=TRUE;TRACE_LEVEL_FILE=0;MODE=Oracle;

    所以我将它们修改为:

    DB_DRIVER=net.sf.log4jdbc.DriverSpy DB_URL=jdbc:log4jdbc:h2:./target/db/notificationdb;AUTO_SERVER=TRUE;TRACE_LEVEL_FILE=0;MODE=Oracl;

这是我的 log4j.properties 文件:

log4j.rootLogger=INFO, stdout                                               
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

一切顺利,您将看到真正的 SQL 查询,甚至是它们的结果。

于 2017-08-14T06:15:02.093 回答