2017-01-10 4 views
0

データベースから取得したオブジェクトを取得したい。私は自分のエンティティのキ​​ャッシュを許可しないことに決めました。この構成を使用することにより:@CacheをEclipseLink

@Cache(
     type = CacheType.NONE/*, 
     alwaysRefresh = true, 
     disableHits = true, 
     coordinationType = INVALIDATE_CHANGED_OBJECTS*/ 
) 

しかし、私はthe documentation here読んだこと:

NONEない

public static final CacheType NONE 
WARNING: Does not preserve object identity and does not cache objects. 

は重要な警告、私はJVMが彼らの本当のアイデンティティにオブジェクトをmisrelateことを理解することです! alwaysRefreshなどのように、オブジェクトをキャッシュしないように最適な設定をすることに関する提案はありますか?

答えて

1

データベースを使用する唯一のアプリケーションであれば、キャッシュを無効にしてはいけません。複数のクライアントがある場合は、キャッシングを無効にするかキャッシングを再構成するのが正しいかもしれません。

どんなキャッシング戦略と同様に、トレードオフは速度データと失効データの間のトレードオフです。ほとんどのJPA実装は、 ersistence C ontexts(第1レベルのキャッシュでも構いません)の間で(第2レベルの)キャッシュを共有します。したがって、em.find()を使用してエンティティをロードすると、インスタンスがすでにキャッシュされている場合は、データベースにアクセスします。別のクライアントがデータベースにアクセスできる場合は、データベースが変更された場合に失効したデータを提供する可能性があります。

クラスタ化されたJPAアプリケーションを使用していて、JPAアプリケーションのみがデータベースにアクセスする場合は、キャッシュ調整を構成している限り、キャッシュを使用できます。キャッシュ調整を使用すると、あるインスタンスがエンティティが更新された場合、他のインスタンスがキャッシュを更新したり、キャッシュされたバージョンを破棄したりできるように、あるインスタンスが他のインスタンスに通知します。

私が構築したソリューションでは、データベースに複数のクライアントがあり、失効したデータを表示したくないため、キャッシュを無効にする必要がほとんどありました。

+0

ありがとうございました。実際、私のアプリケーションはLAN上の多くのクライアントによって使用されています。だから、私は= CacheTypeをSOFT(IDを失わないため)とalwaysRefreshをtrueにタイプすることに決めました。 –

+0

通常、JPAプロバイダでグローバルに設定します。persistence.xmlを使用している場合は、 NONE。通常は、コード専用のアプローチでEclipseLinkを使用して、 '' 'jpaProperties.setProperty(org.eclipse.persistence.config.PersistenceUnitProperties.CACHE_SHARED_DEFAULT、" false ")' ''を設定します。 –

+0

キャッシュをnonoに設定すると、エンティティの参照に問題が発生します。これは私が直面しているようないくつかのランダムな問題があります:http://stackoverflow.com/questions/20920400/jpa-2-eclipselink-caching-issue?lq=1 –