Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
弹簧&x2B;Hibernate:同时使用事务性和非事务性数据源_Hibernate_Spring_Transactional - Fatal编程技术网

弹簧&x2B;Hibernate:同时使用事务性和非事务性数据源

弹簧&x2B;Hibernate:同时使用事务性和非事务性数据源,hibernate,spring,transactional,Hibernate,Spring,Transactional,在我的Spring2.5.6+Hibernate应用程序中,我需要用不同的模式向多个数据库读/写数据。该应用程序在Tomcat上,因此目前我不想使用JTA,这样就不需要迁移到成熟的应用服务器 所以我决定只使用一个事务数据源。我可以和其他人一起生活,而不是做交易 但不知何故,我无法让它工作。你能不能看一下给我一个线索,看看我可能做错了什么 这是我的applicationContext.xml: <bean id="sessionFactory" class="org.springframe

在我的Spring2.5.6+Hibernate应用程序中,我需要用不同的模式向多个数据库读/写数据。该应用程序在Tomcat上,因此目前我不想使用JTA,这样就不需要迁移到成熟的应用服务器

所以我决定只使用一个事务数据源。我可以和其他人一起生活,而不是做交易

但不知何故,我无法让它工作。你能不能看一下给我一个线索,看看我可能做错了什么

这是我的applicationContext.xml:

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!-- ..configuration.. -->
</bean>

<bean id="nonTransactionalSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="nonTransactionalDataSource" />
    <!-- ..configuration.. -->
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <!-- ..configuration.. -->
</bean>

<bean id="nonTransactionalDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <!-- ..configuration.. -->
</bean>

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<bean id="daoHolder" class="com.app.services.TransactionTest$DaoHolder"/>

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="transactionalDao" class="com.app.services.TransactionalDaoImpl">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="nonTransactionalDao" class="com.app.services.NonTransactionalDaoImpl">
        <property name="sessionFactory" ref="nonTransactionalSessionFactory" />
</bean>

作为上述测试的结果,我希望在非事务性数据源中插入一个新行,因为事务性数据源上的更改应该回滚,因为抛出了一个异常。然而,在这个测试通过之后,我看到两个数据源中都插入了行

编辑:我又向前移动了一点。我将DaoHolder制作成一个接口,将上述逻辑移动到一个实现接口的类(DaoHolderImpl)中,并将该类(不仅仅是方法)标记为@Transactional。我还添加了这个类作为Springbean。现在Spring处理我的事务。但这一次,当抛出异常时,新行将从两个数据源回滚,而不仅仅是事务数据源。这仍然不是我所期望的:/

有人知道我做错了什么吗? 提前感谢,


Peter

在“抛出异常”行中放置断点,以便查看一个或两个数据库是否都有该行,怎么样

它不会修复您奇怪的回滚不出现的问题,但可能会告诉您非事务性数据源是否工作良好


您更希望启用spring/hibernate日志来查看事务发生了什么…

没问题,感谢您的尝试:)我刚刚得到了一个点,在抛出一个异常后,我得到了一个回滚(必须将@Transactional添加到整个DaoHolder类中),但这次两个DAO的更改似乎都被回滚了,因为没有插入任何内容。这让我感到惊讶,因为我只希望事务dao回滚。无论如何,这仍然不是我需要的行为。也许您应该配置非事务数据库的刷新模式。行可能被插入到非transactionnal会话中,但刷新没有发生。您在hibernate SQL日志(show_SQL属性)中看到了什么吗?您的数据库配置如何?您是否设置了autocommit=true之类的值?如果我不抛出异常,我会在hibernate SQL日志中看到这两个插入。如果我抛出异常,我看不到任何插入。隐马尔可夫模型。。在日志中我看到:openednewsession[org.hibernate.impl。SessionImpl@1517997]对于Hibernate事务,只需执行一次。所以我想我的问题是因为事实上这两个操作都是在同一个Hibernate会话上完成的。为什么会这样?我怎样才能改变它?对不起,我真的不知道。但通常Spring会将@Transactionnal注释打开的会话绑定到当前线程,因此,如果您使用SpringDAO支持/hibernate模板或类似的东西,它可能会看到会话绑定到线程并简单地使用它。。。在这两个dao中,尝试执行“getSession()”或其他操作,并检查日志是否是同一个objectGreat主意,谢谢:)我会立即尝试。您知道关于spring事务管理的好资源吗?我想更详细地了解当您使用@Transactional注释某个内容时,封面下到底发生了什么。Spring文档很有用,但是他们没有给我提供足够的信息。。。再次感谢。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/applicationContext.xml"})
public class TransactionTest {

@Autowired
private DaoHolder daoHolder;

@Test
public void testTransactions() throws Exception {

    try {
        daoHolder.runTransactionalMethod();
    } catch (Exception exception) {
        System.out.println("Exception caught");
    }
}
public static class DaoHolder {

    @Autowired
    private TransactionalDao transactionalDao;
    @Autowired
    private NonTransactionalDao nonTransactionalDao;

    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW, rollbackFor={Exception.class})
    private void runTransactionalMethod() throws Exception {
        transactionalDao.insertRow();
        nonTransactionalDao.insertRow();
        throw new Exception();
    }

}