【问题标题】:Is an attached Record thread-safe?附加的 Record 线程安全吗?
【发布时间】:2021-06-23 12:30:21
【问题描述】:
附加的 jOOQ Record (UpdatableRecord) 线程安全吗,即我可以在一个线程中附加(获取)记录,然后将其存储在另一个线程中而不会产生负面影响吗?我应该在原始线程中将其分离并重新附加到新线程中吗?
我知道关于 DSLContext 的线程安全的 jOOQ manual page。我正在使用 jOOQ 的 Spring Boot Autoconfiguration,所以它应该都是线程安全的(使用 Spring 的 DataSourceTransactionManager 和 Hikari 池)。
但以下问题仍然存在:
- 当原始线程中的事务被打开并且在原始事务提交之前或之后在另一个线程中调用
store() 时,附加记录的行为如何? jOOQ 每次操作都会打开一个新连接吗?
- 附加的 Record 是否会保持跨线程的连接打开,这可能会导致资源泄漏?
【问题讨论】:
标签:
java
spring
multithreading
jooq
spring-transactions
【解决方案1】:
jOOQ 记录不是线程安全的。它是一个简单的可变容器,由普通的Object[] 支持。因此,在跨线程共享可变状态时可能会出现所有常见问题。
但你的问题并不是关于记录的线程安全性。
当原始线程中的事务被打开,并且在原始事务提交之前或之后在另一个线程中调用 store() 时,附加记录的行为如何? jOOQ 每次操作都会打开一个新的连接吗?
这与Record无关,而是你如何配置jOOQ的ConnectionProvider。 jOOQ 没有连接,甚至没有打开连接。您可以通过ConnectionProvider(可能通过一些Spring 配置的DataSource)向jOOQ 传递连接,显式或隐式地做到这一点。对于每个数据库交互,jOOQ 将 acquire() 一个连接,并在交互后再次 release() 它。 Record 不知道这个连接是如何获得的。它只运行获取和释放连接的 jOOQ 查询。
事实上,jOOQ 甚至并不真正关心您的事务(除非您使用的是 jOOQ 的事务 API,但您没有使用)。
附加的 Record 是否会保持跨线程的连接打开,这可能会导致资源泄漏?
不,记录“附加”到Configuration,而不是连接。 Configuration 包含一个 ConnectionProvider,它可以执行您配置的任何操作。