私は少なくとも1つの関連エンティティを持つレコードのリストを持っています。レコードリストでは、関連するレコードのメインリストとデータが表示されるので、テーブルに100レコードがあれば、doctrineは〜150個のクエリを生成して実行します。これは簡単に2つのクエリに減らすことができます:リストと関連するすべてのエンティティを一度に1つ。symfony 2の第2レベルのキャッシュが有効になっていますが使用されていませんか?
私が見つけたように、doctrineの第2レベルのキャッシュはそのような場合には完璧です。
doctrine:
orm:
second_level_cache:
enabled: true
をそして、すべてのエンティティの注釈@ORM\Cache(usage="READ_ONLY")
に追加:
だから、私は設定でキャッシュを有効にしています。次に、リストを生成する前に、私はすべてのレコードを取得しています両方のテーブルを形成:
$this->getDoctrine()->getRepository('AppBundle:Refuel')->findAll();
$this->getDoctrine()->getRepository('AppBundle:FuelType')->findAll();
私は、彼らがキャッシュされてしまっただろうし、実際のリストdurign〜150個のクエリを生成せずに再利用するレンダリングを望んだとおり。しかし、それは事実ではありません。
Hits: 0
Misses: 2
Puts: 319
だから私は、エンティティはキャッシュされなく再利用されている推測通り:デバッグパネルがある〜150実行されたクエリとキャッシュの統計が残っていることを示しています。どうして?
私がすでに知っているのは、第2レベルのキャッシュは、redisに関連しています。使用したくないです。そのキャッシュを使用するにはredisが必要ですか?
これを設定する方法についてはほとんどドキュメントがありません。
あなたが最初のキャッシュドライバを定義する必要があり、レディス/ Memecachedを使用することができます。 – BDS
この関係のために(怠惰な読み込みではなく)熱心な読み込みをセットアップするか、または 'join'を使って一度にすべてのデータを取得するためのリポジトリメソッドを作成する必要があります。それでも必要な場合は、キャッシュを実装します。 –
イエップ・ジャクブが正しいですが、ここではより良い方法です。キャッシュは、ひどく設計されたクエリに対するパッチにすぎません。 –