在jOOq中,为什么连接与语句结构高度耦合?

时间:2015-05-12 16:16:16

标签: java performance jooq

假设我有一个查询构建器

ResultQuery query = DSL.select().from(TABLE);

和连接/上下文池

DSLContext ctx = DSL.using(conn, SQLDialect.MYSQL)

我希望能够:

  • 为不同的连接/上下文重用相同的查询对象
  • 如果无法使用相同的查询实例,请将查询用作模板
  • 在查询执行过程之外执行查询构建任务

由于jOOQ中的查询对象具有连接的配置:

这是否意味着查询应仅构建在活动连接上下文上?

免责声明:我现在几周都在使用jOOQ,也许我只是缺少一些文档。

例如,下一个代码不是线程安全的,除非它通过查询同步,否则它将不安全。

ctx.fetch(query).map(mapper);

源于2157版本3.5.3的DefaultDSLContext.fetch

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

1 个答案:

答案 0 :(得分:2)

  

为不同的连接/上下文重用相同的查询对象

你不应该用jOOQ 3.x这样做。为什么(某些)jOOQ QueryParts是可变的,有各种历史原因。这将改变 - 希望 - 在jOOQ 4.0中。背景信息:

  

如果无法使用相同的查询实例,请将查询用作模板

你总能做的是实现AST构造函数,它可以即时生成新的QueryParts,例如:

public static Condition template(...) {
    Condition result = DSL.trueCondition();

    if (...)
        result = result.and(...);

    return result;
}

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