Doctrine2缓存更新的元素

时间:2012-05-15 16:55:33

标签: caching doctrine-orm

我的学说有问题。我喜欢缓存,但是如果我更新一个实体并刷新,那么doctrine2是否应该能够清除它的缓存? 否则缓存对我来说用处很少,因为这个项目有很多交互,我总是要为每个查询禁用缓存。 如果缓存总是向他们显示旧的缓存版本,则用户将看不到他们的交互。

有没有办法围绕它?

3 个答案:

答案 0 :(得分:3)

您是在谈论在同一运行时(请求)中保存和获取新实体吗?如果是,那么您需要刷新实体。

$entity = new Entity();
$em->persist($entity);
$em->flush();
$em->refresh($entity);

如果管理实体并进行更改,则这些实体将应用于Entity对象,但仅在调用$ em-> flush()时保留在数据库中。

如果您的缓存返回旧数据集以获取新请求(尽管它在数据库中成功更新),那么听起来您发现了一个错误。你可以在这里提交的文件>> http://www.doctrine-project.org/jira/secure/Dashboard.jspa

答案 1 :(得分:3)

Doctrine2永远不会有删除方法,例如deleteByPrefix,它在某些时候(3年前)在Doctrine1中,并且因为它造成了更多麻烦而被删除了。

页面http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting已过时(doctrine2文档的下一版本将删除这些方法)。您现在唯一能做的就是手动管理缓存:找到ID并在每次更新后手动删除它。

更高级的学说缓存是WIP:https://github.com/doctrine/doctrine2/pull/580

答案 2 :(得分:1)

这是根据Doctrine2上有关如何清除缓存的文档。我甚至不确定这是你想要的,但我想这是值得尝试的。

Doctrine2的缓存驱动程序具有不同级别的删除缓存条目。

您可以通过直接ID,使用正则表达式,后缀,前缀和删除缓存中的所有值来删除

所以要删除你要做的所有事情:

$deleted = $cacheDriver->deleteAll();

要按前缀删除,您需要:

$deleted = $cacheDriver->deleteByPrefix('users_');

我不确定Doctrine2如何命名他们的缓存ID,所以你必须挖掘它。

有关删除缓存的信息,请访问:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting

要获取缓存驱动程序,您可以执行以下操作。它没有在文档中描述,所以我只是稍微查看了代码。

我假设你在这个例子中有一个实体管理器实例:

$config = $em->getConfiguration(); //Get an instance of the configuration
$queryCacheDriver = $config->getQueryCacheImpl(); //Gets Query Cache Driver
$metadataCacheDriver = $config->getMetadataCacheImpl(); //You probably don't need this one unless the schema changed

或者,我猜你可以将cacheDriver实例保存在某种Registry类中并以这种方式检索它。但取决于你的偏好。就个人而言,我尽量不要依赖注册管理机构。

您可以做的另一件事是告诉您正在执行的查询不使用结果缓存。我再也不认为这是你想要的,而是把它扔到那里。主要是你似乎也可以完全关闭查询缓存。除非只有少数特定的查询,否则您不想使用缓存。

此示例来自文档:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#result-cache

$query = $em->createQuery('select u from \Entities\User u');
$query->useResultCache(false); //Don't use query cache on this query
$results = $query->getResult();