OptimisticLockException が EJB レイヤーによって発生したときに、Web レイヤー (.war コード) で OptimisticLockException をキャッチする方法という 1 つの問題があります。
JEE5、GlassFishV2.1、JPA (TopLinks を使用)、およびコンテナ管理のトランザクションを使用しています。しかし、同じエンティティに対する別の同時ユーザーによるトランザクションが原因でダーティ リードが発生すると、実際に発生した war レイヤーで Transaction.RollBackException が発生します。 OptimisticLockException によって。しかし、戦争側で OptimisticLockException をキャッチできません。
em.flush を ejb 側で使用すると、いくつかのカスタム例外をキャッチして war にスローできます。しかし、 em.flush はすべてのデータベースを更新すると思いますが、それは高価な操作ですか?
try{
//some enitity
em.flush()
}
catch(OptimisticLockException ole){
throw ole;
}
私の意見では、90% のケースで OptimisticLockException が発生しないため、em.flush を呼び出さず、.war で EJBException をキャッチしてから再試行します。より良いオプションはありますか?
try{ // コード } catch (EJBException ex) {
if (ex.getCausedByException().getCause().toString().
indexOf("javax.transaction.RollbackException")!= -1){
// do work
}
}
}