我正在将Spring.net 1.2与NHibernate 2.0.1一起使用。 在我的项目中,我面临一些死锁问题,除了对数据库进行调整以最大程度地减少这种情况外,我还想实现Springs 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>
我已将[Repository]属性添加到我的DAO中,以启用ExceptionTranslation,并尝试将RetryAdvice添加到我正在使用的TransactionProxyFactoryObject中,但是它将不起作用。我不知道将此建议放在何处。我必须声明一个PointCut来添加它还是要如何使其按预期工作?
事先感谢-任何帮助表示赞赏。
在等待一个人解决我的问题一个半月之后,我终于有时间自己解决这个问题。实际上,我认为并不是那么困难。也许那就是为什么我找不到任何好的例子。所以我们开始:以下测试将显示用法:
配置:(为简洁起见,省略了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)); }
任何提示或评论表示赞赏。