当前位置: 首页 > 面试题库 >

如何使用NHibernate和Spring为死锁配置RetryAdvice和ExceptionTranslation

吕永寿
2023-03-14
问题内容

我正在将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));
}

任何提示或评论表示赞赏。



 类似资料:
  • 我有两个环境来设置我的API,所以我有生产和开发。我首先需要的是找到一种方法来自动完成这一任务,例如,在运行时,不发送任何参数(-d)应用程序找到了一种方法来识别环境,但我没有找到任何方法来完成这一任务。 所以我看了一个教程,在同样有一个方法放了一个环境变量,并定义了我的application.properties。所以在下面的步骤中: > 我在我的应用程序中定义了3个文件,application

  • 本文向大家介绍Spring Boot使用和配置Druid,包括了Spring Boot使用和配置Druid的使用技巧和注意事项,需要的朋友参考一下 1、引入依赖包 2、配置application.properties 3、目前Spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikari三种连接池。 由于Druid暂时不在Spring Bootz中的直接支持,故需要

  • 主要内容:死锁,活锁,饥饿,总结本节我们来介绍一下死锁、活锁和饥饿这三个概念。 死锁 死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 死锁发生的条件有如下几种: 1) 互斥条件 线程对资源的访问是排他性的,如果一个线程对占用了某资源,那么其他线程必须处于等待状态,直到该资源

  • 各位。我正在为一个编程课做一个游戏,由两条蛇组成,它们朝相反的方向走在一条边界上。它们需要阻挡障碍物,我使用协调使它们不会相互对抗。这意味着第二个尝试访问细胞,需要等到第一个解锁细胞。我已经在这个网站上阅读了很多主题,但我仍然没有找到解决问题的方法。 现在我已经看到蛇在板上四处移动,并在障碍物中阻塞。下面是我的两大问题,我非常感谢您的帮助: 1-有特定的情况,例如,两条蛇走paralell,当他们

  • 主要内容:对于资源,对于进程在这种方法中,OS不应用任何机制来避免或防止死锁。 因此,系统认为死锁肯定会发生。 为了摆脱死锁,OS定期检查系统是否存在死锁。 如果发现死锁,操作系统将使用一些恢复技术来恢复系统。 操作系统的主要任务是检测死锁。 操作系统可以借助资源分配图来检测死锁。 在单个实例化的资源类型中,如果系统中正在形成一个循环,那么肯定会出现死锁。 另一方面,在多实例资源类型图中,检测周期不够。 我们必须通过将资源分

  • 问题内容: 我正在尝试根据某个Maven配置文件是否处于活动状态来使用数据库信息配置Spring配置文件。我已经看到了一些答案,但是很难将它们放在一起。 我有一个这样的Maven个人资料: 还有一个settings.xml文件,如下所示: 并在servlet-context.xml中: 我的问题基本上是,如何将Maven属性放入servlet- context.xml文件中?我需要一个.prope