5

教義に問題があります。私はキャッシングが好きですが、エンティティを更新してフラッシュすると、doctrine2 はそのキャッシュをクリアできないのでしょうか? そうしないと、このプロジェクトには多くのやり取りがあり、文字通り常にクエリごとにキャッシュを無効にする必要があるため、キャッシュはほとんど役に立ちません。キャッシュが常にキャッシュされた古いバージョンを表示する場合、ユーザーは対話を確認できません。

それを回避する方法はありますか?

4

3 に答える 3

3

同じランタイム(リクエスト)内で新しいエンティティを保存およびフェッチすることについて話しているのですか?その場合は、エンティティを更新する必要があります。

$entity = new Entity();
$em->persist($entity);
$em->flush();
$em->refresh($entity);

エンティティが管理されていて変更を加えた場合、これらはエンティティオブジェクトに適用されますが、$ em-> flush()を呼び出したときにのみデータベースに保持されます。

キャッシュが新しいリクエストに対して古いデータセットを返している場合(DBで正常に更新されているにもかかわらず)、バグを発見したようです。ここでファイルできます>> http://www.doctrine-project.org/jira/secure/Dashboard.jspa

于 2012-05-16T13:25:42.207 に答える
3

Doctrine2 never has those delete methods such as deleteByPrefix, which was in Doctrine1 at some point (3 years ago) and was removed because it caused more trouble.

The page http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting is outdated (The next version of the doctrine2 document will see those methods removed). The only thing you can do now is manually managing the cache: find the id and delete it manually after each update.

More advanced doctrine caching is WIP: https://github.com/doctrine/doctrine2/pull/580.

于 2013-03-25T15:09:03.523 に答える
1

これは、キャッシュをクリアする方法に関するDoctrine2のドキュメントによるものです。これがあなたが望んでいるものかどうかさえわかりませんが、試してみる価値があると思います。

Doctrine2 のキャッシュ ドライバーには、キャッシュされたエントリを削除するさまざまなレベルがあります。

正規表現を使用して、直接IDで、接尾辞で、プレフィックスで、キャッシュ内のすべての値を単純に削除して削除できます

したがって、すべてを削除するには、次のようにします。

$deleted = $cacheDriver->deleteAll();

プレフィックスで削除するには、次のようにします。

$deleted = $cacheDriver->deleteByPrefix('users_');

Doctrine2 がキャッシュ ID にどのように名前を付けているかはわかりません。そのため、掘り下げる必要があります。

キャッシュの削除に関する情報はこちらにあります: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting

キャッシュ ドライバーを取得するには、次の手順を実行します。ドキュメントには記載されていなかったので、コードを少しトレースしただけです。

この例では、エンティティ マネージャーのインスタンスがあると想定しています。

$config = $em->getConfiguration(); //Get an instance of the configuration
$queryCacheDriver = $config->getQueryCacheImpl(); //Gets Query Cache Driver
$metadataCacheDriver = $config->getMetadataCacheImpl(); //You probably don't need this one unless the schema changed

または、 cacheDriver インスタンスをある種の Registry クラスに保存して、その方法で取得できると思います。しかし、あなたの好みに依存します。個人的には、レジストリにあまり依存しないようにしています。

他にできることは、実行中のクエリに結果キャッシュを使用しないように指示することです。繰り返しますが、これはあなたが望むものではないと思いますが、ただそこに捨ててください。主に、クエリキャッシュを完全にオフにすることもできます。これは、キャッシュを使用したくない特定のクエリがいくつかない限りです。

この例はドキュメントからのものです: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#result-cache

$query = $em->createQuery('select u from \Entities\User u');
$query->useResultCache(false); //Don't use query cache on this query
$results = $query->getResult();
于 2012-05-22T12:31:00.713 に答える