[SPRING] NHibernate 및 Spring을 사용하여 Deadlocks에 대해 RetryAdvice 및 ExceptionTranslation을 구성하는 방법
SPRINGNHibernate 및 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 개월 반 동안 누군가가 내 문제를 해결하기를 기다린 후에 마침내 혼자 해결할 시간을 찾았습니다. 사실 그것은 그것이 어렵다고 생각하지 않았습니다. 아마 내가 좋은 예를 찾을 수 없었던 것일 수도 있습니다. 그래서 여기에 우리가 간다 : 다음 테스트는 사용법을 보여줄 것이다 :
구성 : (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)); }
모든 힌트 또는 발언을 환영합니다.
from https://stackoverflow.com/questions/2451260/how-to-configure-retryadvice-and-exceptiontranslation-for-deadlocks-using-nhiber by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @Transactional이 메서드 수준에서 작동하지 않습니다. (0) | 2019.04.10 |
---|---|
[SPRING] Spring 3 MVC : 'commandName'바인딩없이 스프링 형식을 사용할 수 있습니까? (0) | 2019.04.10 |
[SPRING] 봄 : ResponseEntity <Void>를 사용하여 빈 HTTP 응답 반환 (0) | 2019.04.10 |
[SPRING] 스프링 보안 - / j_spring_security_check로 디스패치 (0) | 2019.04.10 |
[SPRING] REST 응용 프로그램이 아닌 웹 응용 프로그램에서 404 오류 처리 (0) | 2019.04.10 |