【问题标题】:Logging bind values for a stored procedure using JOOQ使用 JOOQ 记录存储过程的绑定值
【发布时间】:2014-01-28 02:24:41
【问题描述】:

在调试日志级别,JOOQ 正在记录存储的 proc 语句、执行时间和结果数量。但它没有记录存储过程的实际绑定值。我正在将 JOOQ 与 Oracle 一起使用。 Settings 对象准备如下 -

Configuration configuration = new DefaultConfiguration()
    .set(new JooqTxConnectionProvider(dataSource))
    .set(SQLDialect.ORACLE)
    .set(recordMapperProvider)
    .set(new Settings()
        .withRenderSchema(false)
        .withRenderNameStyle(RenderNameStyle.AS_IS)
        .withExecuteLogging(false))
    .set(new DefaultExecuteListenerProvider(
             new CallableStatementExecuteListener()),
         new DefaultExecuteListenerProvider(
             new LoggingExecuteTimeListener(configurationManager)));

日志输出显示如下 -

2014-01-27 23:03:31,204 调试 [requests-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.tools.LoggerListener - 执行查询:开始 STATE.CREATE_SESSION(ID_OUT => ?, 服务器 => ?);结束;

2014-01-27 23:03:31,207 调试 [requests-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.tools.StopWatch - 查询执行时间:总计:2.976 毫秒

2014-01-27 23:03:31,207 DEBUG [requests-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.tools.StopWatch - 整理:总计:3.186ms,+0.209ms

我希望看到的是包含“带有绑定值”的行和过程的实际绑定参数。

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    jOOQ 3.2.2 的默认记录器LoggerListener 似乎没有内联独立存储过程调用的绑定值。这是一个错误,应该修复:#2987

    无论如何,如果你想记录绑定值,你有几个选择:

    1. 启用“跟踪”日志记录。 jOOQ 然后将所有绑定值记录在一个新行上,每一个。但这很冗长
    2. 实现您自己的记录器,该记录器使用内联绑定值重新呈现 Routine 对象。可以这样做:

      @Override
      public void renderEnd(RenderContext ctx) {
          // [...]
          log.debug(DSL.using(configuration)
                       .renderInlined(ctx.routine()));
      }
      

    【讨论】:

      【解决方案2】:

      稍微详细说明一下 Lukas 的回答,这是我当前的配置,使用 jOOQ 3.1.0,包括此日志记录错误的解决方法:

      DSLContext create = DSL.using(
          new DefaultConfiguration()
              .set(new DataSourceConnectionProvider(dataSource))
              .set(SQLDialect.ORACLE)
              .set(
                  new org.jooq.conf.Settings()
                      .withRenderFormatted(true)
                      .withExecuteLogging(false)
              )
              .set(new ExecuteListenerProvider() {
                  @Override
                  public ExecuteListener provide() {
                      return new LoggerListener() {
                          @Override
                          public void renderEnd(ExecuteContext ctx) {
                              super.renderEnd(ctx);
                              JooqLogger log =
                                  JooqLogger.getLogger(LoggerListener.class);
                              if (log.isDebugEnabled()) {
                                  if (ctx.routine() != null) {
                                      log.debug(
                                          DSL.using(ctx.configuration())
                                              .renderInlined(ctx.routine())
                                      );
                                  }
                              }
                          }
                      };
                  }
              })
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 2020-05-21
        • 1970-01-01
        • 1970-01-01
        • 2019-05-15
        • 2014-09-16
        • 2019-12-06
        相关资源
        最近更新 更多