Jooq连接生命周期



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

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

据我所知:

  1. 我可以安全地创建一个DSLContext,以便在多个线程中在应用程序中重用吗?如果我不修改配置,这样做有什么负面影响吗?争鸣等?

  2. 每次我访问数据库时,Jooq是否从池中获得连接,进行数据库访问,然后提交并释放它?例如:

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上下文对所有访问进行重用?

谢谢!

我可以安全地创建一个DSLContext,以便在多个线程中跨应用程序重用吗?

可以,前提是初始化后不再修改Configuration及其组件,例如Settings

如果我不修改配置,这样做有什么负面影响吗?争鸣等?

Au相反,这是建议使用DSLContext的方法。通过重用它,您将从缓存中受益,例如,如果您使用Result.into(MyDto.class)方法等,则用于反射。

每次我访问数据库时,Jooq是否从池中获得连接,进行数据库访问,然后提交并释放它?

是的,如果您的DataSource由池支持,它就是这样工作的。当然,池每次都可以自由地为jOOQ提供相同的连接,这取决于在jOOQ之外管理的事务上下文。jOOQ不在乎。

当使用这样的事务API时:[…]将从池中获得连接,并对使用trans上下文的所有访问重用?

transaction()方法获得一个连接,并在传递给它的TransactionalRunnable(即lambda(期间保持它。嵌套的DSLContext trans实例现在将使用"缓存"的Connection,而不会从DataSource获得新连接。

最新更新