6

Doctrine 2.2.2を使用して、ユーザーの会社とともにユーザーエンティティのクエリを実行しようとしています。内部のデータはほとんど変更されないので、このクエリをキャッシュしたいと思います。以下は私が試したことです:

$user = $em->createQuery('
    SELECT u, c
    FROM Entities\User u
    LEFT JOIN u.company c
    WHERE u.id = :id
')->setParameter('id', $identity)->useResultCache(true, 21600, 'user_' . $identity)->getResult();

どうやら、ユーザーエンティティはキャッシュされていますが、それでも会社のクエリを実行します。両方を同時にフェッチして結果キャッシュに配置する方法はありますか?

私はこれを見つけましたが、それは非常に古く、彼の解決策は私にはうまくいきませんでした。

私はこれを行うように提案されました、そのようなものは結果キャッシュの目的を損ないます。

4

1 に答える 1

1

私はこれをDoctrine2.3で以下を使用してテストしました。

$q->setResultCacheDriver( new \Doctrine\Common\Cache\ApcCache() )
  ->setResultCacheLifetime( 21600 )
  ->setResultCacheId( 'user_' . $identity );

初めて実行すると、sql-loggerに実際のクエリが表示されます。
2回目、3回目などで実行すると、sql-loggerに何も表示されません。

私の結論は、それはうまく機能しているということです。

結果キャッシュが構成されていないか、非永続的な結果キャッシュ(ArrayCacheなど)が構成されているか、Dontrine 2.2.2のバグであると思います(ただし、それについては何も見つかりません) jira)。

PS:Doctrine 2.3にアップグレードした別の質問(Doctrineのデタッチ、キャッシング、マージ)から収集します。あなたはまだこの問題を抱えていますか?

PPS:Doctrine 2.0(2.2だったと思います)の後のどこかで、結果キャッシュが変更されました。ハイドレイトされた結果をキャッシュする代わりに、sql-resultがキャッシュされます(そしてハイドレーションは実行ごとに行われます)。ハイドレイトされた結果をキャッシュする場合は、ハイドレーションキャッシュを使用する必要があります(ただし、これらの結果はEntityManagerにマージされないことに注意してください)。

于 2012-11-15T09:13:50.563 に答える