代码之家  ›  专栏  ›  技术社区  ›  kolrie

在Java中记录PreparedStatements

  •  14
  • kolrie  · 技术社区  · 16 年前

    有一件事总是让人头疼,那就是当您使用PreparedStatement而不是查询本身时,记录SQL(JDBC)错误。

    您总是会收到如下消息:

    2008-10-20 09:19:48,114 ERROR LoggingQueueConsumer-52 [Logger.error:168] Error 
    executing SQL: [INSERT INTO private_rooms_bans (room_id, name, user_id, msisdn, 
    nickname) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE room_id = ?, name = ?, 
    user_id = ?, msisdn = ?, nickname = ?]
    

    在回答了几个问题后编辑:

    到目前为止提供的库似乎适合记录语句以进行调试,这无疑是有用的。然而,我正在寻找一种方法,在发生错误时获取PreparedStatement本身(而不是某个子类)并记录其SQL语句。我不希望使用PreparedStatement的替代实现部署生产应用程序。

    我想我要找的是一个实用类,而不是一个PreparedStatement专门化。

    谢谢

    4 回复  |  直到 15 年前
        1
  •  6
  •   gnat Nat Poor    13 年前

    我试过了 log4jdbc 它帮了我的忙。

    安全注意:截至今天2011年8月,log4jdbc准备语句的记录结果执行起来不安全。它们可以用于分析,但决不能反馈到DBMS中。

    实例

    2010/08/12 16:30:56 jdbc.sqlonly org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) (ID文件、代码1、ID G、ID序列、参考号、名称、酒吧、饮料ID、金额、描述、状态、代码2、拒绝说明、ID客户)


    我的配置与 HSQLDB

    jdbc.url=jdbc:log4jdbc:hsqldb:mem:sample
    

    具有 :

    jdbc.url=jdbc:log4jdbc:oracle:thin:@mybdd:1521:smt
    jdbc.driverClass=net.sf.log4jdbc.DriverSpy
    

    logback.xml:

    <logger name="jdbc.sqlonly" level="DEBUG"/>
    


    根据我的努力,如果你

    您只会得到错误的语句,但是,我不知道这个库是否对性能有影响。

        2
  •  3
  •   skaffman    15 年前

    我认为您可能需要咬紧牙关,编写自己的类,将参数插入占位符SQL。这将很尴尬,因为您不能向PreparedStatement请求已设置的参数,所以在将它们传递给语句之前,您必须在helper对象中记住它们。

    在我看来,封装驱动程序实现对象的一个实用程序库是实现您试图实现的目标的最实际的方法,但无论哪种方法都会令人不快。

        3
  •  3
  •   Anand Rockzz    4 年前

    使用 P6Spy :它的Oracle、Mysql、JNDI、JMX、, 专家 可以打印 堆栈跟踪 . 沉重的呼唤 -以时间为基础。

        4
  •  0
  •   Kieran Tully eswald    15 年前
    1. 如果您使用的是MySQL,那么MySQL连接器的PreparedStatement.toString() does include the bound parameters

    2. 子类PreparedStatement,用于在添加参数时构建查询字符串。无法从PreparedStatement中提取SQL,因为它使用已编译的二进制形式。

    LoggedPreparedStatement

    与记录所有查询的代理驱动程序相比,它们的一个优点是,您可以在记录查询字符串之前修改它。例如,在PCI环境中,您可能希望屏蔽卡号。