【问题标题】:print complete query of PreparedStatement with loggers使用记录器打印 PreparedStatement 的完整查询
【发布时间】:2013-12-05 10:14:34
【问题描述】:

如何使用记录器打印 PreparedStatement 的完整查询?

使用 JDBC 驱动程序为:com.microsoft.sqlserver.jdbc.SQLServerDriver

log4.properties contains
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=logs/ProductDataLibrary.log
log4j.appender.logfile.MaxFileSize=10240KB
log4j.appender.logfile.MaxBackupIndex=0
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{DATE}~ %5p ~ %C:%L ~ %x ~ %m%n

我尝试过使用preparedstatement.toString() 方法,但它打印的是一些@object 而不是完整的SQL 查询?

【问题讨论】:

标签: java mysql jdbc prepared-statement


【解决方案1】:

如果您使用的是抽象层(例如休眠),您可能最好使用它们内置的日志记录。

如果你想自己推出,你应该使用委托模式包装java.sql.Connection。例如:

public class WrappedConnection implements Connection {
    private Connection delegate;
    public WrappedConnection(Connection delegate) { this.delegate = delegate; }
    public PreparedStatement prepareStatement(String sql) {
       PreparedStatement ps = delegate.prepareStatement(sql);
       return new WrappedPreparedStatement(sql, ps);
    }
    // delegate all Connection methods to the delegate
}

public class WrappedPreparedStatement implements PreparedStatement {
    private String sql;
    private PreparedStatement delegate;
    public WrappedPreparedStatement(String sql, PreparedStatement delegate) { 
       this.sql = sql; 
       this.delegate = delegate;
    }
    public String toString() {
        return sql;
    }
    public ResultSet executeQuery() throws SQLException {
        // perhaps you might want to do some logging here?
        return delegate.executeQuery();
    }
    // delegate all PreparedStatement methods to the delegate
}

使用这种方法,您可能还会包装 Connection.createStatement(*)Connection.prepareCall(*)

编辑

看起来有人已经为你做了辛苦的工作,看看log4jdbc

【讨论】:

    【解决方案2】:

    在 log4j.properties 中的 java.sql.PreparedStatement 中添加 DEBUG 或 TRACE 级别

    log4j.logger.java.sql.PreparedStatement=DEBUG
    

    log4j.logger.java.sql.PreparedStatement=TRACE
    

    如果您想获得完整的 JDBC 操作日志记录,请将 DEBUG 级别添加到 java.sql

    log4j.logger.java.sql=DEBUG
    

    或者如果你想为单个 JDBC 类添加一个具体的日志记录

    log4j.logger.java.sql.theclass=DEBUG
    

    一个例子

    log4j.logger.java.sql.Connection=DEBUG    
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG
    log4j.logger.java.sql.ResultSet=DEBUG
    

    edit:我的错,我忘记了SQLServer JDBC驱动不使用log4j

    您不能使用属性文件通过 java.util.logging.LogManager 配置日志记录

    handlers= java.util.logging.FileHandler
    
    
        # Default global logging level.
        .level= ALL
    
        # default file output
        java.util.logging.FileHandler.pattern = /tmp/sql.log
        java.util.logging.FileHandler.limit = 5000000
        java.util.logging.FileHandler.count = 20
        java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
        java.util.logging.FileHandler.level = ALL
    
        # Facility specific properties.
        com.microsoft.sqlserver.jdbc.level=ALL
        com.microsoft.sqlserver.jdbc.Statement.level=ALL
        com.microsoft.sqlserver.jdbc.SQLServerStatement.level=ALL
    

    并在运行时获取它

    LogManager.getLogManager().readConfiguration(new FileInputStream("c:/tmp/sql.properties"));
    

    更多信息

    Tracing Driver Operation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2020-12-28
      • 2016-12-21
      • 2018-11-27
      • 2014-11-19
      相关资源
      最近更新 更多