1

単一のエンティティの entityManager の更新に問題があり、1 分以上かかるという非常に長い時間がかかります。ユーザーが簡単なレコードを編集できる画面があります。たとえば、誰かの名前を変更します。完了したら、保存するかキャンセルすることができます。キャンセル アクションでは、次の行を実行して、変更を加えたが保存したくない場合に、キャッシュされたオブジェクトのコピーから変更をクリアするようにします。

getEntityManager().refresh(getInstance());

これは entityHome Bean にあります。私がやったことが使われている

getEntityManager().clear();

これは私にとって同じことを達成しますが、1秒未満で実行されます.

EE5、JDBC を使用して Oracle 11g DB に接続し、JTA をトランザクションに使用しています。

なぜこれがそんなに時間がかかるのかについて誰か考えがありますか?

4

1 に答える 1

0

refresh()データベースからエンティティをリロードします (エンティティを実行しSELECTてリロードします)。clear()これは、第 1 レベルのキャッシュのみをクリアする場合よりも常に遅くなります。ただしclear()、キャッシュがあり、その中に他のエンティティがある場合は、それらが必要になることに注意してmerge()ください (これは、DB からのリロードも意味します)。

単純なレコードをリロードするのに 1 分は長い時間のように思えるので、ここではロックなどの他の要因が働いていると推測します。

とにかく、これは「キャンセル」ボタンがフォームを送信するために発生します。フォームが送信されると、値がエンティティ インスタンスにコピーされ、ダーティとマークされます。この動作を回避する最も簡単な方法は、「キャンセル」を押したときにフォームを送信しないことです。<s:button/>または<s:link/>「キャンセル」ボタンを使用して POST の代わりに GET を実行します。これは、AJAX 経由で変更を送信する場合を除いて機能します。この場合、エンティティは既に更新されており、ダーティとして設定されています。

于 2013-07-19T09:41:55.967 に答える