附加记录是线程安全的吗?

gr8qqesn  于 2021-07-15  发布在  Java
关注(0)|答案(1)|浏览(323)

是附加的jooq Record ( UpdatableRecord )线程安全,也就是说,我可以在一个线程中附加(获取)一条记录,然后将其存储在另一个线程中而不产生负面影响吗?我应该在原来的线程中分离它,然后在新线程中重新连接它吗?
我知道jooq手册中关于线程安全的页面 DSLContext . 我使用的是jooq的spring引导自动配置,所以应该都是线程安全的(使用spring的datasourcetransactionmanager和hikari池)。
但仍存在以下问题:
当原始线程中的事务被打开时,附加记录的行为如何 store() 是在提交原始事务之前还是之后在另一个线程中调用的?jooq是否每次为每个操作打开一个新连接?
附加的记录是否会保持线程间的连接处于打开状态,从而导致资源泄漏?

bzzcjhmw

bzzcjhmw1#

jooq记录不是线程安全的。它是一个简单的可变容器,由一个普通的 Object[] . 因此,当跨线程共享可变状态时,所有常见的问题都可能出现。
但是你的问题并不是关于记录的线程安全性。
当原始线程中的事务被打开,并且在提交原始事务之前或之后在另一个线程中调用store()时,附加记录的行为如何?jooq是否每次为每个操作打开一个新连接?
这与 Record ,但是如何配置jooq的 ConnectionProvider . jooq没有连接,甚至没有打开连接。您可以通过通过 ConnectionProvider (可能通过一些Spring配置 DataSource ). jooq将为每个数据库交互, acquire() 连接,以及 release() 在互动之后,它再次出现。这个 Record 不知道这个连接是怎么得到的。它只运行jooq查询来获取和释放连接。
事实上,jooq甚至并不真正关心您的事务(除非您使用的是jooq的事务api,但您不是)。
附加的记录是否会保持线程间的连接处于打开状态,从而导致资源泄漏?
不,记录“附加”到 Configuration ,不是连接。那个 Configuration 包含 ConnectionProvider ,它执行您配置它执行的任何操作。

相关问题