我试图在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
暂无答案!
目前还没有任何答案,快来回答吧!