복붙노트

[SPRING] NHibernate 및 Spring을 사용하여 Deadlocks에 대해 RetryAdvice 및 ExceptionTranslation을 구성하는 방법

SPRING

NHibernate 및 Spring을 사용하여 Deadlocks에 대해 RetryAdvice 및 ExceptionTranslation을 구성하는 방법

나는 NHibernate 2.0.1과 Spring.net 1.2를 사용하고있다. 내 프로젝트 내에서 몇 가지 교착 상태 문제를 직면하고 데이터베이스 조작 외에 발생을 최소화하기 위해 Spring RetryAdvice를 구현하려고합니다.  나는 이것을 구성하는 작업 예제를 찾을 수 없다. 참조를 사용하는 방법에 대한 명확한 것 같지만 어떻게 든 그것을 작동시키지 못할 수 있습니다.

<!--Used to translate NHibernate exception to Spring.DataAccessExceptions-->    
<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/>

<!--ExceptionHandler performing Retry on Deadlocks-->
<object name="ExceptionHandlingAdvice" type="Spring.Aspects.RetryAdvice, Spring.Aop">
  <property name="retryExpression" value="on exception name DeadLockLoserException retry 3x rate (1*#n + 0.5)"/>
</object>

ExceptionTranslation을 사용하도록 설정하기 위해 DAO에 [Repository] 속성을 추가했으며 RetryAdvice를 TransactionProxyFactoryObject에 추가하려고했지만 사용 중이지만 작동하지 않습니다. 나는이 충고를 어디에 둘 것인지 이해하지 못한다. 그것을 추가하려면 PointCut을 선언해야합니까, 아니면 예상대로 작동하도록 할 수 있습니까?

사전 Thx - 어떤 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.1 개월 반 동안 누군가가 내 문제를 해결하기를 기다린 후에 마침내 혼자 해결할 시간을 찾았습니다. 사실 그것은 그것이 어렵다고 생각하지 않았습니다. 아마 내가 좋은 예를 찾을 수 없었던 것일 수도 있습니다. 그래서 여기에 우리가 간다 : 다음 테스트는 사용법을 보여줄 것이다 :

    1 개월 반 동안 누군가가 내 문제를 해결하기를 기다린 후에 마침내 혼자 해결할 시간을 찾았습니다. 사실 그것은 그것이 어렵다고 생각하지 않았습니다. 아마 내가 좋은 예를 찾을 수 없었던 것일 수도 있습니다. 그래서 여기에 우리가 간다 : 다음 테스트는 사용법을 보여줄 것이다 :

    구성 : (SessionFactory 및 TransactionManager 등은 간결하게 생략 됨)

      <!-- Retries the Tx after DeadlockExceptions -->
      <object name="ExceptionHandlingAdvice" type="Spring.Aspects.RetryAdvice, Spring.Aop">
        <property name="retryExpression" value="on exception name DeadlockLoserDataAccessException retry 3x delay 1s"/>
      </object>
    
      <!--A Transaction-Configuration for our DAO-MOCK-->  
      <object id="TxProxyConfigurationTemplate" abstract="true" type="Spring.Transaction.Interceptor.TransactionProxyFactoryObject, Spring.Data">
        <property name="PlatformTransactionManager" ref="HibernateTransactionManager"/>
    
        <property name="TransactionAttributes">
          <name-values>
            <add key="ThrowDeadLock*" value="PROPAGATION_REQUIRED"/>
          </name-values>
        </property>
      </object>
    
      <object id="MockDaoTxPFO" parent="TxProxyConfigurationTemplate">
        <property name="Target" ref="MockDao"/>
      </object>
    
      <!--The ProxyFactoryObject based on the DAO-Mock interface-->
      <object id="MockDao" type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop" >
        <property name="proxyInterfaces" value="RetryAdvice.IDaoMock"/>
        <property name="target" ref="MockDaoImpl"/>
        <property name="interceptorNames">
          <list>
            <value>ExceptionHandlingAdvice</value>
          </list>
        </property>
      </object>
    
      <!--Mocked DAO Implementation -->
      <object id="MockDaoImpl" type="RetryAdvice.DaoMock, RetryAdvice">
        <constructor-arg name="maxExceptionCount" value="2" />
      </object>
    

    조롱 된 DAO :이 DAO는 DeadLockLooserExceptions를 두 번 던진 다음 통과합니다.

    public interface IDaoMock
    {
        void ThrowDeadLock();
        int MethodCallCount { get; }
    }
    
    [Repository]
    public class DaoMock : IDaoMock
    {
        private int maxExceptionCount;
        public int MethodCallCount { get; private set; }
    
        public DaoMock(int maxExceptionCount)
        {
            this.maxExceptionCount = maxExceptionCount;
        }
    
        public void ThrowDeadLock()
        {
            MethodCallCount++;
            if (MethodCallCount <= maxExceptionCount)
            {
                throw new DeadlockLoserDataAccessException("FAKE", new HibernateException("This is a fake Exception.", null));
            }
        }
    

    시험:

    [Test]
    public void RetryAdviceTest()
    {
        IDaoMock mockDao = (IDaoMock)this.appContext.GetObject("MockDaoTxPFO");
        mockDao.ThrowDeadLock();
        Assert.That(mockDao.MethodCallCount, Is.EqualTo(3));
    }
    

    모든 힌트 또는 발언을 환영합니다.

  2. from https://stackoverflow.com/questions/2451260/how-to-configure-retryadvice-and-exceptiontranslation-for-deadlocks-using-nhiber by cc-by-sa and MIT license