gpt4 book ai didi

java - JOOQ 中的提交钩子(Hook)

转载 作者:行者123 更新时间:2023-11-30 07:00:00 37 4
gpt4 key购买 nike

我在后端 Web 服务中使用 JOOQ 一段时间了。在许多此类服务中,在将数据持久化到数据库后(或者更好地说,在成功提交数据后),我们通常希望向 Kafka 写入一些有关持久化记录的消息,以便其他服务知道这些事件。

我本质上寻找的是:有没有一种方法可以让我使用 JOOQ 的 DSLContext 对象注册提交后 Hook 或回调,以便我可以在事务成功提交时运行一些代码?

我知道 ExecuteListenerExecuteListenerProvider 接口(interface),但据我所知 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.

让我相信这不是用于提交 Hook 的。

是否有 JOOQ 大师可以告诉我 JOOQ 中是否支持提交 Hook ?如果是这样,请为我指明正确的方向?

最佳答案

ExecuteListener SPI 正在监听单个查询执行的生命周期,即:

innerContext.insertInto(...).execute();

这不是您要找的。相反,您应该实现自己的 TransactionProvider (可能委托(delegate)给 jOOQ 的 DefaultTransactionProvider )。然后,您可以在实际提交逻辑之前实现您想要的任何逻辑。

请注意,jOOQ 3.9 还将提供新的 TransactionListener SPI ( see #5378 ) 来促进这一点。

关于java - JOOQ 中的提交钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081691/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com