【问题标题】:Caching queries in Jooq在 Jooq 中缓存查询
【发布时间】:2013-06-20 20:25:46
【问题描述】:

我尝试在项目中使用 jooq,但出于性能原因,我想缓存查询。在performance consideration section 的用户手册中,提到了查询缓存,但没有关于如何实现它的示例。所以我尝试缓存一个查询(例如 SimpleSelectConditionStep),如下所示:

SimpleSelectConditionStep query = getFromPool();
if(query != null) {
    factory.attach(query);
    query.bind(1,"John");
} else {
   // create query
   factory.select(PERSON).where(PERSON.NAME.equal("Michael"));
}
// fetch and use query
result = query.fetchOne();
.....
putToPool(query);

我的软件是一个多线程 Web 应用程序,但它保证两个不同的线程不能同时使用相同的查询(池在再次放入池之前不会返回相同的查询)。

我知道工厂不是线程安全的对象,但我想知道在代码中使用这样的查询会导致问题吗?

【问题讨论】:

  • 您确定需要缓存查询吗?即使手册中提到了,也只有在经常执行查询时才需要这样做,在这种情况下,您甚至可能想要缓存 PreparedStatement,或者至少是 SQL 字符串...
  • 应用程序中的一个页面有快速响应的要求。我测量操作所花费的时间,最长的准备语句正在获取数据。我尝试缓存 sql 字符串,但是在重新执行 sql 字符串后,我只能得到一个通用结果而不是生成的记录。
  • 你的例子是真实的吗?还是您的查询真的更大?我怀疑您是否需要缓存来处理这种简单的情况。您是否有任何分析数据,显示查询执行的热点?

标签: java database jooq


【解决方案1】:

如果准备语句需要很长时间,您也许可以使用jOOQ的语句重用功能:

http://www.jooq.org/doc/latest/manual/sql-execution/reusing-statements

如果经常执行相同的查询,这将在查询内部保留一个打开的语句。除此之外,我怀疑对于您示例中的简单查询,您应该需要一个 jOOQ 对象的缓存。

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2011-05-06
    • 1970-01-01
    • 2013-06-28
    • 2016-09-20
    相关资源
    最近更新 更多