我的教义有问题。我喜欢缓存,但是如果我更新一个实体并刷新,不应该学说2能够清除它的缓存吗?否则缓存对我来说用处不大,因为这个项目有很多交互,我总是不得不为每个查询禁用缓存。如果缓存总是向他们显示旧的缓存版本,用户将看不到他们的交互。
有办法绕过它吗?
我的教义有问题。我喜欢缓存,但是如果我更新一个实体并刷新,不应该学说2能够清除它的缓存吗?否则缓存对我来说用处不大,因为这个项目有很多交互,我总是不得不为每个查询禁用缓存。如果缓存总是向他们显示旧的缓存版本,用户将看不到他们的交互。
有办法绕过它吗?
您是在谈论在同一运行时(请求)中保存和获取新实体吗?如果是这样,那么您需要刷新实体。
$entity = new Entity();
$em->persist($entity);
$em->flush();
$em->refresh($entity);
如果实体是托管的并且您进行了更改,这些将应用于实体对象,但仅在调用 $em->flush() 时保留到您的数据库。
如果您的缓存正在为新请求返回旧数据集(尽管它已在数据库中成功更新),那么听起来您已经发现了一个错误。你可以在这里归档>> http://www.doctrine-project.org/jira/secure/Dashboard.jspa
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 。
这是根据关于如何清除缓存的 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 实例保存在某种注册表类中并以这种方式检索它。但取决于你的喜好。就我个人而言,我尽量不要过多地依赖注册表。
您可以做的另一件事是告诉您正在执行的查询不要使用结果缓存。再说一次,我认为这不是你想要的,只是把它扔在那里。主要是您似乎还不如完全关闭查询缓存。那是除非它只是一些您不想使用缓存的特定查询。
$query = $em->createQuery('select u from \Entities\User u');
$query->useResultCache(false); //Don't use query cache on this query
$results = $query->getResult();