2

DN3 と GAE 1.7.4 を使用しています。ドキュメントによると、デフォルトでLevel2キャッシュが有効になっているJPA2を使用しています。

これが私の質問です:

オブジェクトを返すクエリを実行すると、これらのオブジェクトは ID によって自動的にキャッシュに入れられますか?

em.find()別のクエリで既に読み込まれているオブジェクトの ID を使用して実行createQuery().getResultList()すると、キャッシュで使用できるようになりますか?

キャッシュを開始するには、トランザクションでmyem.find()または query を実行する必要がありますか?

このキャッシュがどのように機能するか、およびキャッシュを最大限に活用するためにクエリ/検索/永続化を行う方法について明確にする必要があります。

ありがとう

4

2 に答える 2

3

Google App Engineから:AppEngineでのJPAの使用

レベル2キャッシュはデフォルトで有効になっています。以前のデフォルトの動作を取得するには、永続性プロパティdatanucleus.cache.level2.typeをnoneに設定します。(または、クラスパスにdatanucleus-cacheプラグインを含め、永続性プロパティdatanucleus.cache.level2.typeをjavax.cacheに設定して、L2キャッシングにMemcacheを使用します。

疑問については、これはクエリと、DataNucleusおよびGAEデータストアアダプタの実装の詳細によって異なります。キャロル・マクドナルドが提案したように、あなたの質問に対する答えを見つけるための最良の方法は、JPA2キャッシュインターフェースを使用することだと思います...より具体的には、containsメソッドです。

Cacheクエリを実行し、を介してインターフェイスにアクセスし、レベル2が目的のエンティティをEntityManagerFactoryキャッシュするかどうかを確認します。contains

DataNucleusログを有効にすると、舞台裏で何が起こっているかについての良いヒントも得られます。

于 2012-12-28T23:07:39.223 に答える
3

開発ローカルGAEモードでデバッグした後、レベル2のキャッシュが機能することがわかりました。トランザクションの開始/コミットは必要ありません。主キーとem.find()に対する私の単純なクエリの結果は、主キーによってキャッシュに入れられます。

ただし、ローカル開発サーバーのデフォルトのキャッシュタイムアウトは数秒のようなものなので、これを追加する必要がありました。

    <property name="datanucleus.cache.level2.timeout" value="3600000" />

永続性.xmlに。

于 2012-12-30T11:20:11.047 に答える