【问题标题】:Spring 3 and hibernate 4.X facing a transaction Manager Exception in destroy-methodSpring 3 和 hibernate 4.X 在销毁方法中面临事务管理器异常
【发布时间】:2013-02-02 07:23:27
【问题描述】:

我们目前在我们的项目中使用 Spring 3 和 hibernate 4.4。 我的数据库配置 xml 的 sn-p 如下所示

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass">
            <value>${jdbc.driver.className}</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc.url}</value>
        </property>
        <property name="user">
            <value>${jdbc.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
                <prop key="hibernate.current_session_context_class">managed</prop>
            </props>
        </property>
        <property name="packagesToScan" value="com.sample.entity" />
    </bean>
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <tx:annotation-driven />

当我们测试我们的战争时,我们遇到了这个异常。

13:27:19,511 ERROR TransactionInterceptor:419 - Application exception overridden by rollback exception
    org.springframework.beans.factory.BeanCreationNotAllowedException: 
    Error creating bean with name 'transactionManager': Singleton bean creation not allowed 
    while the singletons of this factory are in destruction (Do not request a bean from a 
    BeanFactory in a destroy method implementation!)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:212)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:248)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:100)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)

我无法弄清楚这是否是因为配置文件中提到的 destroy-method =close 。我还在服务层和数据库层使用@Transactional 注释。这会导致任何问题吗? 我们试图测试一个场景,其中多人(大约 150 人)都试图同时访问我们的应用程序。

请帮帮我。如果需要更多详细信息,请告诉我。

谢谢

【问题讨论】:

    标签: java spring hibernate transactions


    【解决方案1】:

    正如春季文档在Section 3.6.1.5 中所说的那样

    启动和关闭调用的顺序可能很重要。如果任何两个对象之间存在“依赖”关系,则依赖方将在其依赖之后开始,并在其依赖之前停止。但是,有时直接依赖关系是未知的。您可能只知道某种类型的对象应该先于另一种类型的对象开始。在这些情况下,SmartLifecycle 接口定义了另一个选项,即在其超级接口 Phased 上定义的 getPhase() 方法。

    所以你需要 bean 来实现 SmartLifeCycle,SmartLifeCycle 接口的 Javadoc 1:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lifecycle-processor

    希望对你有帮助!!

    【讨论】:

    • 感谢 Anugoonj 的回复 .. 但只是想知道,是否可以进行任何配置更改?或者实施 SmartLifecycle 是解决此错误的唯一方法
    猜你喜欢
    • 2013-01-27
    • 2014-02-02
    • 1970-01-01
    • 2011-11-04
    • 2014-07-08
    • 2016-07-25
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    相关资源
    最近更新 更多