2016-03-24 25 views
1

私は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です。

例外がキャッチされている場合、引き続きログに表示されますか?

+0

一部のデバッグでは、何かを明確にする必要があります。 –

+0

デバッグとその他のロギング設定は、アプリケーションに投げ込む前にJPAプロバイダとコンテナがメッセージを記録する原因となっています。そうすれば、あなたに通知せずに例外を取り除く誤ったエラー処理があっても、そのことを知ることができます。 – Chris

+0

@Chrisありがとうございました。それは実際には "なぜ例外がスローされているのか"の質問に実際に答える。 –

答えて

2

EclipseLinkのロギング例外

Use eclipselink.logging.exceptions to specify if exceptions are logged when the are thrown, before returning the exception to the calling application. - See more at: http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_logging_exceptions.htm

のための特別なプロパティeclipselink.logging.exceptionsを持っており、それはデフォルト値がtrueです。したがって、プロパティ値をfalseに設定するだけで済みます。例えば
はpersistence.xmlの

<property name="eclipselink.logging.exceptions" value="false" /> 

UPDATE

にそれはのEclipseLinkドキュメントがeclipselink.logging.exceptions財産の混乱説明を与えることが判明しました。

プロパティ値がshouldLogExceptionStackTraceロガーフラグに設定されているshouldLogExceptionStackTraceフラグの

String exString = getConfigPropertyAsStringLogDebug(PersistenceUnitProperties.LOGGING_EXCEPTIONS, m, session); 
if (exString != null) { 
    log.setShouldLogExceptionStackTrace(Boolean.parseBoolean(exString)); 
} 

名は、それが例外自体についてのスタックトレースをログではなく程度であることを述べています。それは、次のように使用します。私は他のログパラメータをチェックし、ログが適切なログレベルまたは無効にログを使用することですからEclipseLinkの例外を削除する唯一の方法のように見えました

if (shouldLogExceptionStackTrace()) { 
    entry.getException().printStackTrace(new PrintWriter(getWriter())); 
} else { 
    writeMessage(entry.getException().toString()); 
} 

<property name="eclipselink.logging.level" value="OFF"/> 

How To Configure Logging

+0

洞察力が大きい。しかし、これは特に例外のロギングを停止しませんでした。 –

+0

@ jr-devあなたが正しいです。ドキュメンテーションに間違った説明がある。私は答えを更新しました – Evgeny

関連する問題