在jOOq中,为什么连接和语句构造是高耦合的?
In jOOq, why is the connection highly coupled with the statement construction?
假设我有一个查询生成器
ResultQuery query = DSL.select().from(TABLE);
和一个connection/context池
DSLContext ctx = DSL.using(conn, SQLDialect.MYSQL)
我希望能够:
- 为不同的connection/context
重复使用同一个查询对象
- 如果无法使用相同的查询实例,请将查询用作模板
- 在查询执行过程之外执行查询构建任务
由于 jOOQ 中的查询对象具有连接配置:
这是否意味着只能在活动的连接上下文中构建查询?
免责声明:我使用 jOOQ 已经有几周了,也许我只是缺少一些文档。
例如,下一个代码不是线程安全的,除非它通过查询同步,否则它不会安全。
ctx.fetch(query).map(mapper);
来源 DefaultDSLContext.fetch 在 2157 版本 3.5.3
public <R extends Record> Result<R> fetch(ResultQuery<R> query) {
final Configuration previous = Utils.getConfiguration(query);
try {
query.attach(configuration());
return query.fetch();
}
finally {
query.attach(previous);
}
}
reuse the same query object for different connection/context
你不应该使用 jOOQ 3.x 这样做。为什么(某些)jOOQ QueryParts
是可变的有多种历史原因。这将在 jOOQ 4.0 中改变——希望如此。此处的背景信息:
- http://www.jooq.org/doc/latest/manual/sql-building/sql-statements/dsl-and-non-dsl(关于可变性的部分)
- https://github.com/jOOQ/jOOQ/issues/2198
if the same query instance can't be use, use the query as a template
你总是可以做的是实现 AST 构造函数,即时生成新的 QueryParts
,例如:
public static Condition template(...) {
Condition result = DSL.trueCondition();
if (...)
result = result.and(...);
return result;
}
这显然也适用于完整查询。
假设我有一个查询生成器
ResultQuery query = DSL.select().from(TABLE);
和一个connection/context池
DSLContext ctx = DSL.using(conn, SQLDialect.MYSQL)
我希望能够:
- 为不同的connection/context 重复使用同一个查询对象
- 如果无法使用相同的查询实例,请将查询用作模板
- 在查询执行过程之外执行查询构建任务
由于 jOOQ 中的查询对象具有连接配置:
这是否意味着只能在活动的连接上下文中构建查询?
免责声明:我使用 jOOQ 已经有几周了,也许我只是缺少一些文档。
例如,下一个代码不是线程安全的,除非它通过查询同步,否则它不会安全。
ctx.fetch(query).map(mapper);
来源 DefaultDSLContext.fetch 在 2157 版本 3.5.3
public <R extends Record> Result<R> fetch(ResultQuery<R> query) {
final Configuration previous = Utils.getConfiguration(query);
try {
query.attach(configuration());
return query.fetch();
}
finally {
query.attach(previous);
}
}
reuse the same query object for different connection/context
你不应该使用 jOOQ 3.x 这样做。为什么(某些)jOOQ QueryParts
是可变的有多种历史原因。这将在 jOOQ 4.0 中改变——希望如此。此处的背景信息:
- http://www.jooq.org/doc/latest/manual/sql-building/sql-statements/dsl-and-non-dsl(关于可变性的部分)
- https://github.com/jOOQ/jOOQ/issues/2198
if the same query instance can't be use, use the query as a template
你总是可以做的是实现 AST 构造函数,即时生成新的 QueryParts
,例如:
public static Condition template(...) {
Condition result = DSL.trueCondition();
if (...)
result = result.and(...);
return result;
}
这显然也适用于完整查询。