在 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 中改变——希望如此。背景信息在这里:
如果不能使用相同的查询实例,则使用该查询作为模板
你总是可以做的是实现 AST 构造函数,它会即时生成新的QueryParts
,例如:
public static Condition template(...)
Condition result = DSL.trueCondition();
if (...)
result = result.and(...);
return result;
这显然也适用于完整的查询。
【讨论】:
以上是关于在 jOOq 中,为啥连接与语句构造高度耦合?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 self.view 的高度和宽度与子视图的高度和宽度不同?
为啥 UIStackView 中的 UILabel 在重用时会失去高度?