【问题标题】:Setting default fetchSize for JOOQ queries为 JOOQ 查询设置默认 fetchSize
【发布时间】:2016-02-25 08:24:54
【问题描述】:

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

我正在尝试为 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

【问题讨论】:

    标签: oracle jdbc jooq


    【解决方案1】:

    这是一个有趣的想法——在 jOOQ 中应该可以实现,但目前(3.7 版)还不行。对此有一个待处理的功能请求:#4753

    解决方法:使用反射

    目前,您的反射解决方案可能是正确的方法。确实,您将依赖内部结构,但即使该字段被重命名,(可能)总会在某处存在类似的字段

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2011-02-19
      相关资源
      最近更新 更多