为JOOQ查询设置默认fetchSize

时间:2015-11-23 09:27:28

标签: oracle jdbc jooq

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

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

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

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

  1. 通过反思使AbstractResultQuery.fetchSize可访问
  2. 拥有ExecuteListener回复prepareEnd
      如果可能,
    • 向下转发ctx.query()AbstractResultQuery
    • 通过反思
    • 读取AbstractResultQuery.fetchSize
  3. 但这显然违反了API边界,有可能会破坏一天。有更好的解决方案吗?

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

1 个答案:

答案 0 :(得分:2)

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

解决方法:使用反射

目前,您的反思解决方案可能是正确的方法。确实,你会依赖于内部,但即使该字段被重命名,也会(可能)总是在某个地方使用类似的字段

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

另一个解决方案是为jOOQ提供JDBC Connection的包装器(例如jOOQ的DefaultConnection的子类型),它返回JDBC PreparedStatement的包装器(例如,子类型jOOQ的DefaultPreparedStatement),它实现了你想要的行为。

上述DefaultXXX类型被设计为包装器的基本实现,这些包装器只能轻松覆盖JDBC驱动程序行为的一部分。编写一个ConnectionProvider应该很简单,只会将此行为暴露给jOOQ。