Jooq连接生命周期

问题描述 投票:1回答:1

我正在评估Jooq,我想确认我对JDBC连接生命周期的理解。

我正在使用一个连接池(Hikari),并且我使用数据源配置了一个DSLContext。

根据我的理解,我可以安全地创建一个DSLContext。

  1. 我创建一个DSLContext是安全的,我可以在我的应用程序中的许多线程中重复使用?如果我不修改配置的话,这样做有什么不好吗?争执等?

  2. 每次我访问数据库时,Jooq是否会从池中获取一个连接,进行DB访问,然后提交和释放?Eg:

Result<Record> result = context.select().from(AUTHOR).fetch();
Result<Record> otherResult = context.select().from(BOOKS).fetch();

每一次查询都会从池中获取并释放一个新的连接?

  1. 当使用这样的事务API时。
context.transaction(ctx -> {
        DSLContext trans = DSL.using(ctx);
   ...
});

会从池中获取一个连接,然后在所有访问中使用 trans 语境?

谢谢!我正在评估Jooq,我想确认我对JDBC连接生命周期的理解。

jooq
1个回答
1
投票

我可以安全地创建一个DSLContext,并在我的应用程序中的许多线程中重复使用?

是的,你可以,只要在初始化之后,你不修改你的DSLContext。Configuration 及其组件了,例如。Settings.

在不修改配置的前提下,这样做有什么不好吗?争执等?

恰恰相反,这是推荐使用的方式。DSLContext. 通过重用它,你将从缓存中获益,例如,如果你使用了 Result.into(MyDto.class) 方法等。

每次做数据库访问时,Jooq是否从池中获取连接,做DB访问,然后提交和释放?

是的,这就是工作原理,如果你的 DataSource 是由一个池支持的。当然,池子可以自由地每次为jOOQ提供相同的连接,这取决于jOOQ之外的事务上下文,jOOQ并不关心。

当使用这样的事务API时。[... ]一个连接将从池中获得,并被所有使用事务上下文的访问重用?

transaction() 方法获得一个连接,并将其保持在 TransactionalRunnable (即lambda)。你的嵌套的 DSLContext trans 实例现在将与 "缓存 "的 Connection,而不是从你的 DataSource.

© www.soinside.com 2019 - 2024. All rights reserved.