2017-06-04 12 views
1

私は少なくとも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が必要ですか?

これを設定する方法についてはほとんどドキュメントがありません。

+0

あなたが最初のキャッシュドライバを定義する必要があり、レディス/ Memecachedを使用することができます。 – BDS

+1

この関係のために(怠惰な読み込みではなく)熱心な読み込みをセットアップするか、または 'join'を使って一度にすべてのデータを取得するためのリポジトリメソッドを作成する必要があります。それでも必要な場合は、キャッシュを実装します。 –

+0

イエップ・ジャクブが正しいですが、ここではより良い方法です。キャッシュは、ひどく設計されたクエリに対するパッチにすぎません。 –

答えて

1

正解を持っている@BDSと@ Jakubのコメントを拡張するだけであれば、クエリを熱心な読み込みに変更する必要があります(クエリ内で両方のエンティティタイプを選択しているのですべてのレコードは)一度にフェッチされます:あなたはそれをやった後は、2番目のレベルのキャッシュを利用することを見て開始することができます

$refuel= $this->m_em 
     ->getRepository('AppBundle:Refuel') 
     ->createQueryBuilder('r') 
     ->select('r,t') 
     ->join('r.fuel_type', 't') 
     ->getQuery() 
     ->getResult(); 

。その後、

​​

そして、あなたのキャッシュ可能なエンティティに注釈を追加します:そのためには、[_prod] .ymlあなたの設定でキャッシュドライバを指定する必要が

/** 
* @ORM\Entity 
* @ORM\Table(name="fos_user") 
* @ORM\Cache(usage="NONSTRICT_READ_WRITE", region="my_region") 
*/ 
関連する問題