5

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

有办法绕过它吗?

4

3 回答 3

3

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

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

如果实体是托管的并且您进行了更改,这些将应用于实体对象,但仅在调用 $em->flush() 时保留到您的数据库。

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

于 2012-05-16T13:25:42.207 回答
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 。

于 2013-03-25T15:09:03.523 回答
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 实例保存在某种注册表类中并以这种方式检索它。但取决于你的喜好。就我个人而言,我尽量不要过多地依赖注册表。

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

这个例子来自文档: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();
于 2012-05-22T12:31:00.713 回答