【问题标题】:Logging prepared sql statements in postgres jdbc driver在 postgres jdbc 驱动程序中记录准备好的 sql 语句
【发布时间】:2011-11-03 23:34:28
【问题描述】:

我想在我的 java 应用程序中记录所有准备好的 sql 语句。我正在使用标准的 postgres jdbc 驱动程序 org.postgresql.Driver。此驱动程序有一个名为“ loglevel”,可以设置为 1 (INFO) 或 2 (DEBUG)。关键是如果参数设置为 1,它几乎不记录任何内容,如果设置为 2,则跟踪太像了

...
20:59:05.608 (2)  FE=> Bind(stmt=null,portal=null,$1=<'5'>,$2=<'13'>)
20:59:05.609 (2)  FE=> Describe(portal=null)
20:59:05.609 (2)  FE=> Execute(portal=null,limit=1)  
20:59:05.609 (2)  FE=> Sync
20:59:05.648 (2)  <=BE ParseComplete [null]
20:59:05.649 (2)  <=BE BindComplete [null]
20:59:05.649 (2)  <=BE NoData
20:59:05.649 (2)  <=BE CommandStatus(UPDATE 1)
...

有没有办法只记录语句+参数?

【问题讨论】:

    标签: java postgresql jdbc


    【解决方案1】:

    您很幸运,您使用的是 PostgreSQL。 PostgreSQL JDBC 驱动程序的 PreparedStatement 实现(至少,从 8.x 或其他版本开始)有它的 toString() 以这种方式被覆盖,因此您可以看到所有参数填充在正确位置的整个 SQL 语句。所以你可以这样做:

    preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setString(1, value1);
    preparedStatement.setString(2, value2);
    // ...
    logger.debug(preparedStatement); // Will show entire SQL with all values.
    

    logger 只是您的记录器,例如 slf4j/logback 或其他东西)

    【讨论】:

    • 我在 9.1 版本的驱动程序中没有看到这个。
    • 适用于我的 9.3。
    • 如果您可以访问应用程序代码,可以。知道如何记录您无法更改(但配置日志记录)的第三方代码的语句吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2018-11-12
    • 1970-01-01
    • 2014-04-25
    • 2014-10-14
    • 2015-07-14
    • 1970-01-01
    相关资源
    最近更新 更多