我正在评估Jooq,我想确认我对JDBC连接生命周期的理解。
我正在使用一个连接池(Hikari),并且我使用数据源配置了一个DSLContext。
根据我的理解,我可以安全地创建一个DSLContext。
我创建一个DSLContext是安全的,我可以在我的应用程序中的许多线程中重复使用?如果我不修改配置的话,这样做有什么不好吗?争执等?
每次我访问数据库时,Jooq是否会从池中获取一个连接,进行DB访问,然后提交和释放?Eg:
Result<Record> result = context.select().from(AUTHOR).fetch();
Result<Record> otherResult = context.select().from(BOOKS).fetch();
每一次查询都会从池中获取并释放一个新的连接?
context.transaction(ctx -> {
DSLContext trans = DSL.using(ctx);
...
});
会从池中获取一个连接,然后在所有访问中使用 trans
语境?
谢谢!我正在评估Jooq,我想确认我对JDBC连接生命周期的理解。
我可以安全地创建一个DSLContext,并在我的应用程序中的许多线程中重复使用?
是的,你可以,只要在初始化之后,你不修改你的DSLContext。Configuration
及其组件了,例如。Settings
.
在不修改配置的前提下,这样做有什么不好吗?争执等?
恰恰相反,这是推荐使用的方式。DSLContext
. 通过重用它,你将从缓存中获益,例如,如果你使用了 Result.into(MyDto.class)
方法等。
每次做数据库访问时,Jooq是否从池中获取连接,做DB访问,然后提交和释放?
是的,这就是工作原理,如果你的 DataSource
是由一个池支持的。当然,池子可以自由地每次为jOOQ提供相同的连接,这取决于jOOQ之外的事务上下文,jOOQ并不关心。
当使用这样的事务API时。[... ]一个连接将从池中获得,并被所有使用事务上下文的访问重用?
的 transaction()
方法获得一个连接,并将其保持在 TransactionalRunnable
(即lambda)。你的嵌套的 DSLContext trans
实例现在将与 "缓存 "的 Connection
,而不是从你的 DataSource
.