私はJPAを使用してWeblogicにアプリケーションを持っています。ときどきオブジェクトをDBにマージすると、SQLIntegrityConstraintViolationExceptionが発生します。私はその例外をキャッチし、それを処理します。問題は、まだ捕捉され処理されているにもかかわらず、ログに例外が表示されていることです。いくつかのコード:私はmergeItemが時々失敗することがわかりログで私は例外をキャッチしますが、ログにスローされます。
@Stateless(name = "MyEJB", mappedName = "MyService-MySessionEJB")
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class MyEJBBean implements MyEJBSessionEJB,
MySessionEJBLocal {
@PersistenceContext(unitName="MyModel")
private EntityManager em;
public Item mergeItem(Item item) {
return em.merge(item); //This throws the SQLIntegrityConstraintViolationException, an internal exception wrapped in TransactionRolledbackLocalException. Which I'm catching in the caller
}
/** <code>select o from Items o where o.itemName = :itemName</code> */
public Item findItem(String itemName) {
try {
return (Item)em.createNamedQuery("Item.findByName").setParameter("itemName", itemName).getSingleResult();
} catch (NoResultException e) {
return null;
}
}
}
からメソッドを呼んでいる
public class MyClass implements MessageListener {
public void onMessage(Message message) {
//do stuff
SomeItem someItem = processItem(request);
localEJB.mergeAnotherItem(someItem);
}
private SomeItem processItem(ItemType item) throws Exception {
int retry = 0;
boolean success = false;
while ((!success) && (retry <= 3)) {
try {
Item dbItem = myEJB.mergeItem(item); //this causes exception
item = dbItem;
success = true;
} catch (TransactionRolledbackLocalException ex) {
retry++;
if (ex.getCause().toString().contains("SQLIntegrityConstraintViolationException")) {
logger.log("TransactionRolledbackLocalException SQLIntegrityConstraintViolationException while merging on try # " + retry);
Item dbItem2 = myEJB.findItem(itemName);
if dbItem2 != null) {
item= dbItem2 ;
}
if (retry > 3) {
//log
}
}
}catch(Exception ex){
//log cause, etc
}
}
}
マイEJBコード。その後、再試行します。これは、最初の再試行後に機能します。しかし、それは
警告失敗したときに、私は3つのエントリを参照してログに:
UnitOfWork(738260825)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.1.v20111018-r10243): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (ITEM1_UK) violated
エラー:
Exception occurred during commit of transaction Name=[EJB MyEJB.mergeItem(Item)],Xid=BEA1-29FF28139113B72A3D9D(738260452),Status=Rolled back. [Reason=Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.1.v20111018-r10243): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (ITEM1_UK) violated
そして、私のログエントリを、私は例外をキャッチ
TransactionRolledbackLocalException SQLIntegrityConstraintViolationException while merging on try # 1
私は明らかに例外をキャッチしていますが、同時にログにも例外が表示されます。 私はException eをキャッチしようとしますが、それは決してキャッチしません...例外はトランザクション1です。
例外がキャッチされている場合、引き続きログに表示されますか?
一部のデバッグでは、何かを明確にする必要があります。 –
デバッグとその他のロギング設定は、アプリケーションに投げ込む前にJPAプロバイダとコンテナがメッセージを記録する原因となっています。そうすれば、あなたに通知せずに例外を取り除く誤ったエラー処理があっても、そのことを知ることができます。 – Chris
@Chrisありがとうございました。それは実際には "なぜ例外がスローされているのか"の質問に実際に答える。 –