使用JOOQ记录存储过程的绑定值

时间:2014-01-28 02:24:41

标签: java sql jooq

在调试日志记录级别,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 DEBUG [requests-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.tools.LoggerListener - 执行查询:begin STATE.CREATE_SESSION(ID_OUT => ;?,SERVER =>?);端;

2014-01-27 23:03:31,207 DEBUG [requests-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.tools.StopWatch - 执行的查询:总计:2.976ms

2014-01-27 23:03:31,207 DEBUG [requests-52 R:30 A:400663505008 E:400663505008 S:400049845008] org.jooq.tools.StopWatch - Finishing:Total:3.186ms,+ 0.209ms < / p>

我希望看到的是包含“with bind values”的行和该过程的实际绑定参数。

2 个答案:

答案 0 :(得分:2)

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

无论如何,如果要记录绑定值,您有几个选项:

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

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

答案 1 :(得分:1)

请详细说明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())
                                );
                            }
                        }
                    }
                };
            }
        })
);