4

私は現在、永続化のために JPA (現在、Toplink) を使用するプロジェクトに取り組んでいます。現在、単一のアプリケーション サーバーを実行していますが、冗長性を確保するために、ロード バランサーと別のアプリケーション サーバーを追加したいと考えています (成長するにつれて、さらに多くのサーバーを追加する可能性もあります)。

まず、JPA キャッシングの問題に直面しています。2 つのプロセスが同じデータベースを更新するため、JPA キャッシュはデータベースではなく、キャッシュされた値を返します。それをオフにする方法がわかり、データベース自体が一定レベルのキャッシュを実装しています。ここに行く方法は、キャッシュを完全にオフにすることですか? JPAに常にクエリレベルでデータベースから取得するように指示する方法はわかりますが、マルチサーバー環境では、常にそれを実現したいと思うでしょう。

この特定の質問に加えて、複数のアプリケーション サーバーを使用して JPA ソリューションを実装した人や、実装中に発生した問題 (および提案) に興味があります。

どうもありがとう。

4

1 に答える 1

6

あなたが見つけたように、共有キャッシュを無効にすることができます

データと要件に応じて、EclipseLink で使用できるその他のオプションもあります。

オプションのリストは次のとおりです。

  1. 共有キャッシュを無効にする

  2. キャッシュ調整を有効にします ( http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/config/PersistenceUnitProperties.html#COORDINATION_PROTOCOLを参照) 。

  3. キャッシュ無効化タイムアウトを設定します ( http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/annotations/Cache.html#expiry%28%29を参照) 。

  4. オプティミスティック・ロックを有効にすると、失効したオブジェクトを更新できなくなります。失効したデータの更新が発生すると失敗し、EclipseLinkはキャッシュ内のオブジェクトを自動的に無効にします。

  5. 分散キャッシュを提供するために、EclipseLinkとOracle CoherenceのOracle TopLink統合を調査します。

http://en.wikibooks.org/wiki/Java_Persistence/Caching#Caching_in_a_Clusterも参照してください。

完璧な解決策はありません。通常使用される解決策は、データ/クラスに依存します。通常、アプリケーションには、一連の読み取り専用クラス、読み取り専用クラス、および書き込み専用クラスがあります。個人的には、1 日のタイムアウトで読み取り専用のキャッシュを有効にし、ほとんどの読み取りでキャッシュ調整を使用してキャッシュを有効にし、ほとんどの書き込みでキャッシュを無効にします。

于 2010-08-10T14:02:47.697 に答える