在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)

我希望能够:

由于 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 中改变——希望如此。此处的背景信息:

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;
}

这显然也适用于完整查询。