为 JOOQ 查询设置默认的 fetchSize

Setting default fetchSize for JOOQ queries

Oracle 的行预取大小为 10,这对于我们通过 JOOQ 执行的查询来说通常太小了。但是,应用程序的大部分使用 JPA,为此我们不能在不增加 GC 风险的情况下增加获取大小 activity.

我正在尝试为 JOOQ 查询设置默认提取大小,这样

dsl.selectZero().from("DUAL").fetch();                // fetchSize: 100
dsl.selectZero().from("DUAL").fetchSize(123).fetch(); // fetchSize: 123

只有 JOOQ 查询受到影响,这一点很重要。我如何实现这一目标?我想到的唯一解决方案如下:

  1. 使AbstractResultQuery.fetchSize可通过反射访问
  2. 有一个 ExecuteListenerprepareEnd 回调
    • 如果可能,将 ctx.query() 向下转换为 AbstractResultQuery
    • 通过反射读取AbstractResultQuery.fetchSize

但这显然违反了API的界限,可能有一天会崩溃。有更好的解决方案吗?

PS:同样的问题适用于其他 JDBC 参数,例如 queryTimeout.

这是一个有趣的想法 - 它应该可以在 jOOQ 中使用,但目前(3.7 版)还不行。有一个待处理的功能请求:#4753.

解决方法:使用反射

目前,您的反射解决方案可能是正确的方法。的确,您将依赖内部机制,但即使该字段已重命名,某处(可能)总会有一个类似的字段

解决方法:使用 JDBC 类型包装器

另一种解决方案是为 jOOQ 提供 JDBC Connection 的包装器(例如 jOOQ 的 DefaultConnection), which returns a wrapper for a JDBC PreparedStatement (e.g. a subtype of jOOQ's DefaultPreparedStatement 的子类型),它实现了您想要的行为。

以上 DefaultXXX 类型被设计为包装器的基本实现,可以轻松仅覆盖 JDBC 驱动程序行为的一部分。编写一个仅向 jOOQ 公开此行为的 ConnectionProvider 应该很简单。