首页 > 解决方案 > 不在事务中时在 JOOQ ExecuteListener 中执行查询

问题描述

我试图在 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;PG - 10.13;JDBC 驱动程序 - 9.4.1212.jre7;春季启动 - 1.5.21

标签: javasqlpostgresqlspring-bootjooq

解决方案


推荐阅读