java - 不在事务中时在 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
解决方案
推荐阅读
- jquery - css jquery动画与文本之间的延迟
- javascript - 测量卷轴最准确的方法是什么?
- angular - dotnet 核心中的 Angular 应用程序。页面不会更新正在更改的文件的更改
- swift - Firebase Observe() 说明
- android - 由于 Retrofit enqueue() 方法未完成,创建 ArrayAdapter 时崩溃
- php - 无法使用 PHP cURL 正确登录网站
- docker - Ubuntu Docker - 从官方 Dockerfile 构建的 php composer 失败,COPY 失败 Step 9/12 stat no such file or directory
- c# - ASP .NET Core 2.1 站点的 nlog 设置
- vba - 从 DAO.OpenRecordSet 访问 2007 错误 3151。怎么修?
- java - Java Android:如何使用谓词
和 Room 一起从数据库中检索特定元素?