9

と呼ばれるProductエンティティがあり、ユーザーが製品情報ページにアクセスするたびにこのエンティティが読み込まれるとします。通常、リクエストごとにdbにヒットしないように、オブジェクトをZend_Cache(memcache)に1時間保存しますが、プロキシオブジェクトがあるため、Doctrine2エンティティではそれが不可能であると理解しています。

だから私の質問は、リクエストごとにデータベースから同じエンティティをロードしないようにするにはどうすればよいですか?

[編集]

このようにDoctrineCacheを使ってみました

    $categoryService = App_Service_Container::getService('\App\Service\Category');
    $cache = $categoryService->getEm()->getConfiguration()->getResultCacheImpl();
    $apple = $cache->fetch('apple');

しかし、次のエラーが発生します

警告:require(App / Entity / Proxy / _ CG _ /App/Entity/Category.php)[function.require]:ストリームを開くことができませんでした:/ opt / vhosts / app / price /library/にそのようなファイルまたはディレクトリはありません163行目のDoctrine/Common / ClassLoader.php

これはZendCacheでも同じであり、Proxyクラスのためにエンティティをシリアル化できません。

4

5 に答える 5

3

いくつかのオプションがあります。

  1. Doctrineの組み込みの結果キャッシュを使用する
  2. Zend_Cacheを介してエンティティをmemcacheに貼り付けてみてください。引き抜くときに、プロキシを逆参照できるように、製品をEMにmerge()する必要がある場合があります。製品情報を表示するために必要な関連付けをフェッチして参加し、読み取りのみを行っている場合、このshoudlは正常に機能します。
  3. エンティティをキャッシュしないでください。代わりに、生成した出力をキャッシュしてください。

編集:ハイドレーションのオーバーヘッドを気にせず、mysqlを使用していて、Productsと関連するテーブルがあまり頻繁に変更されない場合は、mySQLクエリキャッシュのみに依存することをお勧めします。これはかなり鈍いオブジェクトですが、言及するのに十分便利です。

于 2012-05-29T20:29:19.913 に答える
1

Doctrine 2には、エンティティのシリアル化/逆シリアル化に関する特別な要件と制限があるため、エンティティクラスの実装__sleepまたはメソッドを試してみることをお勧めします(これは、エンティティをZend_Cacheに格納するときに発生します)。__wakeup

于 2012-09-10T14:43:59.617 に答える
0

timdevの言うことを二番目に:Doctrineにはキャッシュが組み込まれているので、それを使用したいと思います。

また、パフォーマンスの問題が発生しているのか、それとも過度に熱心な最適化の犠牲になっているのか、という質問からも疑問に思います。

于 2012-09-13T07:04:23.887 に答える
0

私はこれを自分でいじっただけで、データベースに格納されているプロキシオブジェクトに問題がなかったので、これは非常に奇妙だと思います。それで、あなたの構成が100%セットアップされていないと推測していますか?

構成に問題がある場合は、timdevが、オブジェクトをEntityManagerにマージし直す必要があると言っていることに注意してください。そうしないと、奇妙なバグが発生します。

利用可能な4番目の解決策は、データをオブジェクトではなく配列として取得することですが、もちろん、モジュールに接続されているすべての機能が失われます。

于 2012-08-03T08:38:11.013 に答える
0

私には、構成エラーのように思えます。プロキシが生成されていないか、プロキシディレクトリと名前空間に問題があります。

構成に応じて、プロキシは自動または手動で生成できます。あなたのプロキシは実際に下で生成されていますApp/Entity/Proxyか?これは本当に正しいディレクトリですか?

FYIプロキシは、実行することで手動で生成できますdoctrine orm:generate-proxies <dest-dir>

于 2012-08-04T16:38:44.980 に答える