0

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

<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 人)都试图同时访问我们的应用程序。

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

谢谢

4

1 回答 1

0

正如弹簧文档在第 3.6.1.5 节中所说

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

所以你需要 bean 来实现 SmartLifeCycle,SmartLifeCycle 接口1的 Javadoc :http : //static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory- 生命周期处理器

希望这可以帮助 !!

于 2013-02-02T08:14:08.490 回答