2015-01-12 13 views
8

私はSymfony2プロジェクトに取り組んでいます。私のプロジェクトは、データを格納するためにデータベースを使用し、そのデータを取得するためにDoctrine2を使用します。キャッシングDoctrineの結果Symfony2

データベース内のデータが増加するにつれて、クエリが非常に遅くなり、Webアプリケーション全体が読み込むのに約2分かかるか、まったく読み込まれません。

私の自己修正を見ることができる唯一の方法は、いくつかのクエリ結果をキャッシュすることですが、どうやってそれを行うことができます。そのような問題を扱う異なる方法がない限り。

+0

実行されるSQLクエリの数はいくつですか?これはSymfony2ツールバーで見ることができます。これが膨大な数(100など)であれば、リポジトリに関数を作成することでこの数を減らすことができます([ランダムな例](http://stackoverflow.com/a/27907665/2257664))。 –

答えて

16

doctrine configuration(あなたの場合はresult_cache_driverが重要です)にキャッシュドライバをインストールして設定する必要があります。あなたはこの実行した後は、あなたがuseResultCache(true)

$cachedResult = $doctrine->getManager() 
    ->createQueryBuilder() 
    ->(...) 
    ->useResultCache(true) 
    ->(...) 

チェックthis blog post

NOTEを設定することで、結果キャッシュを使用するようにDoctrineを行うことができます。デフォルトでは、DEV環境では、結果キャッシュは使用されません

EDITDBALを使用していて、使用していないORM - SymfonyDoctrineBundleはこの種類のキャッシュをそのまま使用することはできませんが、これを追加できますthis詳細ガイド

+0

Dzieki..私はこれを見て、それが行くと私はいくつかの結果を取得するとすぐに戻ってみましょう。 – Tomazi

+1

このキャッシュはユーザーセッションごとにすばやく質問されるか、グローバルにキャッシュされます.. – Tomazi

+0

、またはDBのクエリに応答するクラスの上でこれを実行できますか?/ ** * @Cache(expires = "+ 5 minutes"、public = true) */' – Tomazi

0

開発者モードでは、Symfony2はすべてのクエリで新しいキャッシュを作成します。それで、あなたが多くのクエリを持っているとしたら、すべてのクエリを1つずつキャッシュします。

プロダクションモードでは、キャッシュは1回だけ保存されるため、プロダクションモードよりも時間がかかります。

+0

しかし、私は理解していますが、ボットの開発と生産環境に問題があります – Tomazi

+0

yopuは最初に生産モードに移行するためにキャッシュをクリアする必要があります..! php app/console assetic:dump –

関連する問題