在 jOOq 中,为啥连接与语句构造高度耦合?

Posted

技术标签:

【中文标题】在 jOOq 中,为啥连接与语句构造高度耦合?【英文标题】:In jOOq, why is the connection highly coupled with the statement construction?在 jOOq 中,为什么连接与语句构造高度耦合? 【发布时间】:2015-07-23 15:37:34 【问题描述】:

假设我有一个查询生成器

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

和一个连接/上下文池

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

我希望能够:

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

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

这是否意味着查询只能建立在活动连接上下文上?

免责声明:我从几周前开始使用 jOOQ,也许我只是缺少一些文档。


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

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

source DefaultDSLContext.fetch at 2157 version 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);
    

【问题讨论】:

【参考方案1】:

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

您不应该在 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

如果不能使用相同的查询实例,则使用该查询作为模板

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

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

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

    return result;

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

【讨论】:

以上是关于在 jOOq 中,为啥连接与语句构造高度耦合?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 self.view 的高度和宽度与子视图的高度和宽度不同?

为啥 UIStackView 中的 UILabel 在重用时会失去高度?

tomcat的连接器

根据字符长度怎样计算出需要显示的label宽度高度

为啥通过 AJAX 无限滚动加载的内容的高度在加载后没有正确测量?

为啥溢出-y 属性不适用于百分比高度