为 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 查询受到影响,这一点很重要。我如何实现这一目标?我想到的唯一解决方案如下:
- 使
AbstractResultQuery.fetchSize
可通过反射访问
- 有一个
ExecuteListener
的 prepareEnd
回调
- 如果可能,将
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
应该很简单。
Oracle 的行预取大小为 10,这对于我们通过 JOOQ 执行的查询来说通常太小了。但是,应用程序的大部分使用 JPA,为此我们不能在不增加 GC 风险的情况下增加获取大小 activity.
我正在尝试为 JOOQ 查询设置默认提取大小,这样
dsl.selectZero().from("DUAL").fetch(); // fetchSize: 100
dsl.selectZero().from("DUAL").fetchSize(123).fetch(); // fetchSize: 123
只有 JOOQ 查询受到影响,这一点很重要。我如何实现这一目标?我想到的唯一解决方案如下:
- 使
AbstractResultQuery.fetchSize
可通过反射访问 - 有一个
ExecuteListener
的prepareEnd
回调- 如果可能,将
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
应该很简单。