java—不在事务中时在jooq executelistener内执行查询

hrirmatl  于 2021-08-01  发布在  Java
关注(0)|答案(0)|浏览(226)

我试图在jooq中的每个dml调用之前设置一些事务变量。为此,我添加了以下代码:

@RequiredArgsConstructor
@Component
public class TriggerEnablerExecuteListener extends DefaultExecuteListener implements ExecuteListenerProvider {

    @Override
    public void executeStart(ExecuteContext ctx) {
        if (ctx.type() == ExecuteType.WRITE) {
            DSLContext db = new DefaultDSLContext(ctx.connection(), POSTGRES);
            db.execute("SET LOCAL enable_trigger = 'true'");            
        }
    }

    @Override
    public ExecuteListener provide() {
        // Stateless listener
        return this;
    }
}

这很有效,但只有在事务内部执行查询时才有效。当不在事务中运行时,此操作失败,出现异常:

DataAccessException: SQL [SET LOCAL enable_trigger = 'true']; PooledConnection has already been closed.

我意识到set local在不在事务中时不起作用,一般来说,不在事务中运行是一种不好的做法,但我仍然没有想到会在这里失败。在postgres中运行相同的查询只会生成一个警告。
我见过这个问题,但我相信这是一个更简单的用例,因为我使用的是常规的jooq连接提供者。
版本
jooq-3.10.8;第10.13页;jdbc驱动程序-9.4.1212.jre7;Spring Boot-1.5.21

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题