1

JPA/EclipseLink がエンティティ オブジェクトを L2 共有キャッシュにキャッシュしていないという問題がありました。リクエストを繰り返すと、SQL ステートメントが Derby にヒットするためです。これをデバッグしたところ、結局のところキャッシュが機能していることがわかりました。実際に起こっていたのは、存在しない (null を返す) エンティティに対する entityManager.find 要求だけがキャッシュされていなかったことです (キャッシュ内で管理および保持するオブジェクトがありません)。私が想像するケース)。これらのリクエストは、毎回データベースに到達するものでした。

以前に要求されたキーが存在しないという事実をシステム(EclipseLink?)に「キャッシュ」させて、データベースにアクセスせずにnullを返す方法はありますか?

Glassfish バージョン 3.1.2.1 を使用しています。

4

1 に答える 1

1

何かが存在しなかったからといって、それが存在しないという保証はありません。一般的なユースケースは、何かが存在するかどうかを確認し、それが作成されていないかどうかを確認することです。そのため、何かが存在しないことをキャッシングする際には注意する必要があります。

オブジェクトキャッシュのEclipseLinkにはこれの設定はありませんが、クエリキャッシュには設定があります。

検索操作に名前付きクエリを定義すると、そのクエリのキャッシュを有効にすることができます。デフォルトでは、クエリ キャッシュは null の結果をキャッシュします (これは構成可能です)。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Query_Cache

于 2013-05-06T15:28:51.437 に答える