2010-12-11 9 views
2

GlassFish 2.1.1(JavaEE 5、JPA 1.0、私の知る限り)のアプリケーションを書いています。他のトランザクションで行われた変更がEntityManagerに表示されない

@PersistenceContext(name = "persistence/em", unitName = "pu") 
private EntityManager em; 

@Resource 
private UserTransaction utx; 

@Override 
protected void doPost(...) { 
    utx.begin(); 
    . . . perform retrieving operations on em . . . 
    utx.rollback(); 
} 

web.xmlそれには次の通りです:

問題がある
<persistence-context-ref> 
    <persistence-context-ref-name>persistence/em</persistence-context-ref-name> 
    <persistence-unit-name>pu</persistence-unit-name> 
</persistence-context-ref> 

、EM」はdoesnの私は(私は主にインターネット上でいくつかのサンプルから借りた)私のサーブレットに次のコードを持っています他のトランザクションで行われた変更を参照してください。概略的には、Webブラウザからサーブレットにリクエストを行い、データを参照し、SQLコンソールでDMLを実行し、サーブレット・ページをリロードします。変更は表示されません。私はem.flushutx.rollbackem.joinTransactionの多くの組み合わせを使用しようとしましたが、それはうまくいっていないようです。

私はJPAの初心者であるために状況が複雑になるため、基本的な機械の仕組みがはっきり理解できません。だから、どんな助けと何が起こっているのか、もっと重要なのは、説明/リンクは非常に高く評価されます。ありがとう!

答えて

2

JPA実装では、アクセスされたエンティティのキ​​ャッシュが維持されます。 JPAを使用せずに別のトランザクションで操作を実行すると、キャッシュは最新でなくなり、変更が反映されることはありません。

変更を確認するには、キャッシュを更新する必要があります。この場合、すべてのエンティティがキャッシュから削除されます。もちろん、これをいつ行うべきか(他のトランザクションが完了した後)を知る必要があります。そうしないと、あいまいなエンティティが引き続き表示されます。これがビジネス上の必要性であれば、JPAはおそらく問題のドメインに適していません。

関連:

  1. Are entities cached in jpa by default ?
  2. Invalidating JPA EntityManager session
+0

「あなたはJPAを使用せずに、別のトランザクションでの操作を実行すると、キャッシュが最新ではなくなりました」 - それがあることを意味しています私はJPAを使用して前述のケースでデータを修正しましたが(一部の外部ツールではありません)、サーブレットページをリロードした後に変更が表示されますか? –

+0

@Andy、そうです。実際、EntityManagerはキャッシュを維持する責任があります。 JPA概念ガイドは、OpenEJB - http://openejb.apache.org/3.0/jpa-concepts.htmlに掲載されています。 –

0

おそらくSQLコンソールで行われたトランザクションをコミットする必要があります。

1

axtavtが言うように、あなたはコンソールでトランザクションをコミットする必要があります。これを想定して、PersistenceManager(または基礎となるインフラストラクチャ)によってデータがまだキャッシュされている可能性があります。

キャッシングに関するトラブルを防ぐには、手で取り除くことができます(退去のタイミングを知っておく必要があるため難しいかもしれません)。または悲観的なロックに進むことができます。ペシミスティック・ロックはパフォーマンスに大きな影響を及ぼしますが、データベースへの複数の独立した接続がある場合は、選択肢がありません。

プロセスに異なるソースからの同時読み込み/書き込みがある場合は、実際には悲観的なロックが必要な場合があります。場合によっては、外部ソースからのバッチ更新がある場合は、そのバッチジョブから、削除する必要があるJPAアプリケーションを通知しようとすることがあります。おそらくWebサービスなどを介して。そうすれば、全体的に悲観的なロック性能の低下を招くことはありません。

ここで賢明な教訓は、プロセスの同期が本当に複雑になる可能性がある:)

関連する問題