我的代码有时会以相当闲聊的方式进行大量数据库查询:
// Process all users:
for (User u : users) {
// multiple queries per single user
w = Website.find("owner = ?", u.id);
d = Demo.find("...");
...
}
上面的代码只从特殊的管理页面调用,所以它不必非常快,但我想达到合理的性能。有没有一种通用的方法可以在不完全重写的情况下做到这一点?
我想象的是一个播放模块,它可以实现以下功能:
// Preprocess - warm cache
Website.findAll();
Demo.findAll();
// After the above code was run, all the data is cached in the scope of this request, so
// the following code should now not do any fetches to the database
// Process all users:
for (User u : users) {
// multiple queries per single user
w = Website.find("owner = ?", u.id);
d = Demo.find("...");
...
}
尝试构建这样的优化层是否正确?你会如何处理它?
正如我所看到的,它的优势在于,这使我可以在原型设计阶段“编写愚蠢的代码”,并在需要时轻松地将其优化到一个不错的水平。当然,它不会达到最佳性能,也不适用于非常大的表,但对于某些任务,它可能是有益的。
或者......我应该直接吞下它并从头开始重写代码,而不依赖于“神奇”的缓存层吗?