5

結果のキャッシュを設定しようとしているリポジトリがあります。これを行う方法については、オンラインで 1 つの例しか見つけることができませんでした...しかし、リポジトリの 1 つに例を実装すると、エラーが発生します。キャッシュに APC を使用しており、クエリ キャッシュを有効にして config.yml ファイルで APC を使用しています。APC に 512M を割り当てましたが、現在 50M しか使用していません (このうち 23M は、この単一の失敗したキャッシュ エントリ用です)。

私が持っているリポジトリコードは次のとおりです。

class AchievementRepository extends EntityRepository
{
    function findAchievementsByCategory($categoryObj)
    {
        $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title")
            ->setParameter('category',$categoryObj);
        $em->useResultCache(true,3600,'findAchievementsByCategory');
        $result=$em->getResult();
        return $result;
    }
}

そして、これが実行されると、次のエラーが発生します

Notice: apc_store() [<a href='function.apc-store'>function.apc-store</a>]: &quot;type&quot; returned as member variable from __sleep() but does not exist in /data/www/ftw2/Symfony/vendor/doctrine-common/lib/Doctrine/Common/Cache/ApcCache.php line 80 

apc.php ファイルを調べて何がキャッシュされているかを確認すると、ユーザー キャッシュ セクションにキャッシュ エントリがあり、保存されている値は次のとおりです。

Fatal error:  Nesting level too deep - recursive dependency? in /data/www/localhost/apc.php on line 1000

どこが間違っているかについて、誰かが私に指示を与えることができますか?

このエンティティには、ManyToOne の列がいくつかあります。これを機能させるには、このクエリで遅延読み込みを無効にする必要がありますか? もしそうなら...どうやって?編集: ,fetch="EAGER" を ManyToOne マッピングに追加して熱心な読み込みを有効にしました...リンゴはありません:(

編集 #2:回答- ワーキング クラスのコード (エンティティ クラス (Achievement) のすべてのプロパティが保護されていることに注意してください)

class AchievementRepository extends EntityRepository
{
    function findAchievementsByCategory($categoryObj)
    {
        $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title")
            ->setParameter('category',$categoryObj);
        $em->useResultCache(true,3600,'findAchievementsByCategory');
        $result=$em->getArrayResult();
        return $result;
    }
}
4

1 に答える 1

2

Doctrine がエンティティをキャッシュするとき、シリアライズされた状態を保存します。問題は、プライベート プロパティ (Doctrine によって生成されたときのデフォルトの可視性) をシリアル化できないことです。これを修正するには、エンティティ プロパティを保護する必要があります。詳細: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html#merging-entities

もう 1 つは、Symfony 2.1 に含まれる Doctrine バージョン 2.2 で (最終的に) 修正された既知の問題です。何らかの理由でアップグレードできない場合、関連付けをキャッシュする唯一の方法は、getArrayResultエンティティを設定する代わりに を使用することです。

于 2012-06-29T13:16:43.070 に答える