Doctrine 2导致缓存失效

时间:2012-06-23 18:12:19

标签: caching doctrine-orm apc cache-invalidation

我在检索用户(消息应用)的新消息数量的查询中使用了Doctrine 2的结果缓存:

$query->useResultCache(true, 500, 'messaging.nb_new_messages.'.$userId);

我试图像这样(在我的实体存储库中)使这个缓存无效:

public function clearNbNewMessagesOfUserCache($userId) {
    $cacheDriver = $this->getEntityManager()->getConfiguration()->getResultCacheImpl();
    $result  = $cacheDriver->delete('skepin_messaging.nbNewMessages.'.$userId);

    if (!$result) {
        return false;
    }

    return $cacheDriver->flushAll();
}

因此,我不需要在我的网站的每个页面上进行无用的查询。

我的问题:是推荐的做法吗?我最终会遇到问题吗?

1 个答案:

答案 0 :(得分:2)

我有想法构建一个onFlush钩子。 在那里,您有所有排队等待插入,更新和删除的实体,因此您可以根据实体名称和标识符等使缓存无效。

不幸的是,我还没有构建任何事件监听器,但我绝对打算为我的项目构建这样的东西。

Here是指向onFlush事件

的学说文档的链接

修改 甚至有一种更简单的方法来实现事件。 在实体类中,您可以将@HasLifecycleCallbacks添加到注释中,而不是使用@PreUpdate或@PrePersist注释定义函数。 每次更新或持久保存此模型时,都会调用此函数。

/**
 * @Entity
 * @Table(name="SomeEntity")
 * @HasLifecycleCallbacks
 */
class SomeEntity
{
    ...

    /**
     * @PreUpdate
     * @PrePersist
     */
    public function preUpdate()
    {
        // This function is called every time this model gets updated
        // or a new instance of this model gets persisted

        // Somethink like this maybe... 
        // I have not yet completely thought through all this.
        $cache->save(get_class($this) . '#' . $this->getId(), $this);
    }
}

那么也许这可以用来使实体的每个实例无效?