4

EclipseLink 2.4 キャッシュを無効にしようとしているので、他のアプリケーションによって DB でデータが変更された場合、EclipseLink 2.4 を使用しているアプリケーションで同じデータが再起動せずに更新されます。これらのプロパティはどれも機能していないようです:

<shared-cache-mode>NONE</shared-cache-mode>
...
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.cache.size.default" value="0"/>
<property name="eclipselink.cache.type.default" value="NONE"/>
<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.refresh" value="true"/>

役に立った唯一のオプションは次のとおりです。

typedQuery.setHint(QueryHints.REFRESH, HintValues.TRUE);

em.find()しかし、これは私にとってはオプションではありません。アプリケーションが作成されたので、すべてのクエリまたはメソッドを検索してこのヒントを入力したくないからです。

EDIT1:同様の問題がここで説明されています: http://eclipse.1072660.n5.nabble.com/Notifications-about-external-database-changes-td5389.html

EDIT2:要約すると、すべてのクエリと検索呼び出しでデータベースから取得したデータが更新されることを望みます。

4

3 に答える 3

5
<shared-cache-mode>NONE</shared-cache-mode>
or,
<property name="eclipselink.cache.shared.default" value="false"/>

正しいメカニズムです。または、特定のクラスに @Cache アノテーションを使用します。

問題は、両方のクエリに同じ EntityManager を使用していることだと思います。EntityManager は、管理するすべてのインスタンスのキャッシュを維持するためにも必要です。これらのオブジェクトを常に更新すると、アプリケーションが行った変更が破棄されます。(EntityManager はトランザクション オブジェクトです)。

リクエストごと、またはトランザクションごとに新しい EntityManager を作成するか、clear() を呼び出して管理対象オブジェクトを破棄する必要があります。

EclipseLink は WEAK EntityManagers もサポートしますが、適切な設計は、長寿命の EntityManagers を持たないことです。

于 2012-11-29T14:47:27.970 に答える
1

私は同じ問題を抱えていると思います。とにかくpersistence.xmlキャッシュプロパティ(shared-cache、eclipselink-cache ...)を介してすべてのキャッシュをクリアしようとしていましたが、ランダムにエンティティの古いインスタンスを取得しました。明らかにパターンはありません.....

とんでもない!

于 2014-01-05T19:23:34.330 に答える
0

リクエストごとに新しい EntityManager を作成し、

<property name="eclipselink.query-results-cache" value="false"/>

1 つのリクエストで JPA を介してエンティティを変更した後、次のリクエストでエンティティを取得しても、OptimisticLocking の問題が発生します。問題を解いてみてください。

于 2014-06-27T18:06:18.450 に答える