【发布时间】: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 字符串后,我只能得到一个通用结果而不是生成的记录。
-
你的例子是真实的吗?还是您的查询真的更大?我怀疑您是否需要缓存来处理这种简单的情况。您是否有任何分析数据,显示查询执行的热点?