是附加的jooq Record
( UpdatableRecord
)线程安全,也就是说,我可以在一个线程中附加(获取)一条记录,然后将其存储在另一个线程中而不产生负面影响吗?我应该在原来的线程中分离它,然后在新线程中重新连接它吗?
我知道jooq手册中关于线程安全的页面 DSLContext
. 我使用的是jooq的spring引导自动配置,所以应该都是线程安全的(使用spring的datasourcetransactionmanager和hikari池)。
但仍存在以下问题:
当原始线程中的事务被打开时,附加记录的行为如何 store()
是在提交原始事务之前还是之后在另一个线程中调用的?jooq是否每次为每个操作打开一个新连接?
附加的记录是否会保持线程间的连接处于打开状态,从而导致资源泄漏?
1条答案
按热度按时间bzzcjhmw1#
jooq记录不是线程安全的。它是一个简单的可变容器,由一个普通的
Object[]
. 因此,当跨线程共享可变状态时,所有常见的问题都可能出现。但是你的问题并不是关于记录的线程安全性。
当原始线程中的事务被打开,并且在提交原始事务之前或之后在另一个线程中调用store()时,附加记录的行为如何?jooq是否每次为每个操作打开一个新连接?
这与
Record
,但是如何配置jooq的ConnectionProvider
. jooq没有连接,甚至没有打开连接。您可以通过通过ConnectionProvider
(可能通过一些Spring配置DataSource
). jooq将为每个数据库交互,acquire()
连接,以及release()
在互动之后,它再次出现。这个Record
不知道这个连接是怎么得到的。它只运行jooq查询来获取和释放连接。事实上,jooq甚至并不真正关心您的事务(除非您使用的是jooq的事务api,但您不是)。
附加的记录是否会保持线程间的连接处于打开状态,从而导致资源泄漏?
不,记录“附加”到
Configuration
,不是连接。那个Configuration
包含ConnectionProvider
,它执行您配置它执行的任何操作。