【发布时间】:2017-04-26 04:30:32
【问题描述】:
我在后端 Web 服务中使用 JOOQ 已经有一段时间了。在其中许多服务中,在将数据持久化到数据库之后(或者更好地说,在成功提交数据之后),我们通常希望向 Kafka 写入一些关于持久化记录的消息,以便其他服务知道这些事件。
我实际上在寻找的是:有没有办法让我使用 JOOQ 的 DSLContext 对象注册提交后挂钩或回调,以便在事务成功提交时运行一些代码?
我知道ExecuteListener 和ExecuteListenerProvider 接口,但据我所知,void end(ExecuteContext ctx) 方法(应该用于生命周期结束时使用)在提交事务时不会被调用。但在每次查询后都会调用它。
这是一个例子:
public static void main(String[] args) throws Throwable {
Class.forName("org.postgresql.Driver");
Connection connection = DriverManager.getConnection("<url>", "<user>", "<pass>");
connection.setAutoCommit(false);
DSLContext context = DSL.using(connection, SQLDialect.POSTGRES_9_5);
context.transaction(conf -> {
conf.set(new DefaultExecuteListenerProvider(new DefaultExecuteListener() {
@Override
public void end(ExecuteContext ctx) {
System.out.println("End method triggered.");
}
}));
DSLContext innerContext = DSL.using(conf);
System.out.println("Pre insert.");
innerContext.insertInto(...).execute();
System.out.println("Post insert.");
});
connection.close();
}
似乎总是打印出来:
Pre insert.
End method triggered.
Post insert.
让我相信这不适用于提交挂钩。
是否有一位 JOOQ 大师可以告诉我 JOOQ 中是否支持提交挂钩?如果是这样,请指出我正确的方向?
【问题讨论】:
-
尝试结合
TransactionProvider、RecordListener和ExecuteListener。您可以在本地线程中捕获 c/u/d 记录,然后根据最外层事务的完成情况丢弃或发布。
标签: java sql transactions hook jooq