Oracle的行预取大小为10,对于我们通过JOOQ执行的查询来说,这通常太小了。但是,应用程序的大部分内容都使用JPA,我们无法在不增加GC活动风险的情况下增加获取大小。
我正在尝试为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
。
答案 0 :(得分:2)
这是一个有趣的想法 - 它应该可以在jOOQ,但目前(版本3.7)不是。有一个待处理的功能请求:#4753。
目前,您的反思解决方案可能是正确的方法。确实,你会依赖于内部,但即使该字段被重命名,也会(可能)总是在某个地方使用类似的字段
另一个解决方案是为jOOQ提供JDBC Connection
的包装器(例如jOOQ的DefaultConnection
的子类型),它返回JDBC PreparedStatement
的包装器(例如,子类型jOOQ的DefaultPreparedStatement
),它实现了你想要的行为。
上述DefaultXXX
类型被设计为包装器的基本实现,这些包装器只能轻松覆盖JDBC驱动程序行为的一部分。编写一个ConnectionProvider
应该很简单,只会将此行为暴露给jOOQ。