我在代码中多次使用Doctrine Entity Manager,我以这种方式使用了例如:
$em = $this->getDoctrine()->getManager();
$countries = $em->getRepository('CommonBundle:Country')->findAll();
可以使用这种格式的Doctrine Cache吗?我看到很多文档,但它们都与Doctrine Query Builder有关,有什么建议吗?如何为SELECT
查询启用缓存?
缓存不起作用(艰难)
我正在处理缓存结果,我这样做是为了缓存一些查询:
在orm
的{{1}}配置下启用APC:
config.yml
将存储库附加到我的实体:
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
metadata_cache_driver: apc
result_cache_driver: apc
query_cache_driver: apc
在存储库类中编写一个方法来获取数据并缓存结果:
/**
* @ORM\Entity(repositoryClass="CommonBundle\Entity\Repository\CountryRepository")
*/
class Country {
....
但是每当我重新加载页面时,查询都会按照分析器中的显示执行(见下图):
我做错了什么?缓存只适用于生产或也适用于开发?不应该获得缓存结果而不是一次查询数据库吗?
答案 0 :(得分:1)
您必须在symfony配置中为结果启用缓存:
doctrine:
orm:
metadata_cache_driver: apc # or memcache
result_cache_driver: apc # or memcache
query_cache_driver: apc # or memcache
然后在每个需要缓存的请求上,调用
$query->useResultCache(true)
此处提供了更多高级选项:http://docs.doctrine-project.org/en/2.0.x/reference/caching.html#result-cache
答案 1 :(得分:1)
EntityRepository API不允许使用find * methods启用ResultCache。
您必须使用QueryBuilder和/或DQL请求。
我写了一篇关于Doctrine缓存的文章,也许它可以帮到你:http://blog.alterphp.com/2014/05/doctrine2-optimization-with-apc-cache.html