附加的 Record 是线程安全的吗?

Is an attached Record thread-safe?

附加的 jOOQ Record (UpdatableRecord) 是线程安全的吗,即我可以在一个线程中附加(获取)记录,然后将其存储在另一个线程中而不会产生负面影响吗?我应该在原来的线程中分离它并在新线程中附加它吗?

我知道 jOOQ manual page 关于 DSLContext 的线程安全。我正在使用 jOOQ 的 Spring 引导自动配置,所以它应该都是线程安全的(使用 Spring 的 DataSourceTransactionManager 和 Hikari 池)。

但还有以下问题:

jOOQ 记录不是线程安全的。它是由普通 Object[] 支持的简单可变容器。因此,跨线程共享可变状态时可能会出现所有常见问题。

但你的问题并不是关于记录的线程安全。

How does an attached Record behave when a transaction in the original thread is opened, and store() is called in another thread either before or after the original transaction has been committed? Does jOOQ open a new connection every time for each operation?

这与 Record 无关,而是你如何配置 jOOQ 的 ConnectionProvider。 jOOQ 不保持连接甚至不打开连接。您可以通过 ConnectionProvider(可能通过某些 Spring 配置的 DataSource 向 jOOQ 传递一个连接来显式或隐式地做到这一点。对于每次数据库交互,jOOQ 都会在交互后再次 acquire() a connection, and release() 它。 Record不知道这个连接是怎么获得的。它只运行获取和释放连接的 jOOQ 查询。

事实上,jOOQ 甚至并不真正关心你的交易(除非你正在使用 jOOQ 的交易API,但你不是)。

Would the attached Record be keeping a connection open across threads, which might then lead to resource leaks?

不,记录“附加”到 Configuration,而不是连接。 Configuration 包含一个 ConnectionProvider,它执行您配置的任何操作。