1

我有一个像 Bellow 一样的存储库。

代码首先检查项目是否已经在表中。

  • 如果不是,它会下载数据,然后将其存储到表中。

  • 如果它已经在表中,它只会返回记录。

但是有时在它检查表中的项目之后,它仍然会去尝试下载并存储该项目,即使它已经存在,从而产生密钥冲突,但这绝不应该发生,因为它只是搜索并没有找到它。

注意事项:

  1. 如果我禁用 $query->useResultCache(true) 我没有问题。
  2. 这是唯一在桌面上工作的过程。
  3. 这是代码中唯一将项目添加到表中的地方。
  4. 此代码是从 symfony2 控制台命令调用的。
  5. Memcache 是为学说 2 设置的缓存。
  6. Memcached 在本地运行。
  7. 使用 arraycache 时也会产生错误。
  8. 此查询每秒运行多次。
    类 ItemRepository 扩展 EntityRepository
    {
      公共函数 findOrFetch($id)
      {

        $item = $this->findItem($id);

        如果($项目!=空)
          返回$项目;
        别的
          {
        $itemData = $this->fetchItem($id);

        $ 项目 = 新项目();
        $item->setId($id);
        $item->setName($itemData['name']);
        $this->getEntityManager()->persist($item);
        $this->getEntityManager()->flush();
          }
      }

      私有函数 findItem($id)
      {
        $查询 = $这个
          ->getEntityManager()
          ->createQuery('SELECT i from MonkeyWire\WowProfToolsBundle\Entity\Item i WHERE i.id = ?1');
        $query->setParameter(1, $id);
        $query->useResultCache(true);

        返回 $query->getOneOrNullResult();
      }

      私有函数 fetchItem($id)
      {
        $api = 新客户端();
        $api->setRequest(new Curl());

        尝试
          {
        $itemData = $api->getItemsApi()->getItem($id);
          }
        捕捉(NotFoundException $e)
          {
        $itemData['name'] = "na";
          }

        返回 $itemData;
      }
    }
4

1 回答 1

0

听起来您可能需要在添加新项目时使结果缓存过期。

$query->expireResultCache();

根据您的存储库,您可能需要进行一些重组以适应它:

class ItemRepository extends EntityRepository
{
    public $findQuery = null;
    ...
    public function findOrFetch($id)
    {
        ...
        $this->getEntityManager()->flush();
        $this->findQuery->expireResultCache();
          }
    }

    private function findItem($id)
    {
      $query = $this
        ->getEntityManager()
        ->createQuery('SELECT i from MonkeyWire\WowProfToolsBundle\Entity\Item i WHERE i.id = ?1');
      $query->setParameter(1, $id);
      $this->findQuery = $query;
      ...
    }
}
于 2012-09-13T02:21:28.137 回答