上面配置有个小错误,更正下:<bean id="datasource_local" ..............<bean id="datasource_remote" .............2个id不能相同嘛。:P

解决方案 »

  1.   

    你说的这种情况我也没用过,不过估计要麻烦一些。
    你需要建立两个datasource,向你上面的那种明显是不对的,spring中不允许有同名的bean。然后设置两个sessionFactory,然后把datasource注入到相应的sessionFactory中。最后就是配置事务了,是否能使用同一个事务我不清楚,我觉得恐怕不行,除非你在代码中手工注入,把sessionFacotry1和sessionFacotry2注入HibernateTransactionManager或(JTA)中。这需要你新写一个事务处理类来实现。但是我对你的两个数据库使用同一种事务处理方式有些异议,这种做法很少见,而且有欠考虑。
    我还是推荐你采用不同的处理方式比较好,配置两个事务处理基类,其余的具体使用只要extends基类就可以了。
      

  2.   

    确实如此。
    我觉得是不是要自己通过继承那些spring已经提供了的TransactionManager(jdbc的, hibernate的,jta的),来写一个TransactionManager, 可以给它注入多个datasource. 重载: doRollback() protected void doRollback(DefaultTransactionStatus status) {
    DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction();
    Connection con = txObject.getConnectionHolder().getConnection();
    if (status.isDebug()) {
    logger.debug("Rolling back JDBC transaction on Connection [" + con + "]");
    }
    try {
    con.rollback();
    }
    catch (SQLException ex) {
    throw new TransactionSystemException("Could not roll back JDBC transaction", ex);
    }
    }里面使用:
    con1.rollback();
    con2.rollback();但 doRollback () 只传入了一个DefaultTransactionStatus这些都是框架定了的,如果真的修改那么篇幅很大哦,有看后怕的嘛。
      

  3.   

    补充:Connection的实例con 是通过 DefaultTransactionStatus来获取的,所以安道理如果注册给TransactionManager多个datasource,在这里那么应该有多个DefaultTransactionStatus和这些datasource对应,然后才能获取 con1,con2,........才有后面的 con1.rollback(), con2.rollback()......不知道这样行不?
      

  4.   

    呵呵,本来就是一个轻量级的框架考虑用ejb吧,对分布式支持很好的
      

  5.   

    可以是可以,需要自己改动spring了,不过建议你尽量不要这么做。楼上说的很对,spring其实本来就是一个轻量级的框架,对于分布式而言,实际上是spring的软肋,你就不要赶鸭子上架楞是为难spring了。实际上,照我说的这种做法你虽然可以实现,但是我觉得实在有些牵强。
      

  6.   

    分布式事务请使用jta,Spring对jta事务是提供了支持的。
      

  7.   

    我在一些论坛上看到了,有些人说Spring其实不是轻量级框架哈,也许刚出来的时候分布式功能确实没有ejb那么强大,但Spring还是提供了分布式计算的东东的。呵呵,有点偏题了哈。现在1.2.5的spring出来了,我看了它的新功能介绍,不过没有事务方面的。
    对于jta我打算去摸一下。谢谢楼上的3位师兄。
      

  8.   

    建议楼上几位先把分布式事务基本概念搞清楚,再去谈论Spring啥的!
    这个帖子不错
    http://www.jdon.com/jive/article.jsp?forum=121&thread=18249
      

  9.   

    mxlmwl(飞星):但是我对你的两个数据库使用同一种事务处理方式有些异议,这种做法很少见,而且有欠考虑。
    我还是推荐你采用不同的处理方式比较好,配置两个事务处理基类,其余的具体使用只要extends基类就可以了
    ----------------------------------------------------------------
    简直胡说八道!楼主的问题用spring很容易实现:配置两个容器管理的数据源、分别配置sessionFactory、最后配置一个Spring提供的JTA事务管理器就行了
      

  10.   

    楼上正解。以下是从SpringReference中copy过来的。
    <beans>  <bean id="myDataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName value="java:comp/env/jdbc/myds1"/>
      </bean>  <bean id="myDataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/myds2"/>
      </bean>  <bean id="mySessionFactory1" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource1"/>
        <property name="mappingResources">
          <list>
            <value>product.hbm.xml</value>
          </list>
        </property>
        <property name="hibernateProperties">
          <props>
            <prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
          </props>
        </property>
      </bean>  <bean id="mySessionFactory2" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource2"/>
        <property name="mappingResources">
          <list>
            <value>inventory.hbm.xml</value>
          </list>
        </property>
        <property name="hibernateProperties">
          <props>
            <prop key="hibernate.dialect">net.sf.hibernate.dialect.OracleDialect</prop>
          </props>
        </property>
      </bean>  <bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>  <bean id="myProductDao" class="product.ProductDaoImpl">
        <property name="sessionFactory" ref="mySessionFactory1"/>
      </bean>  <bean id="myInventoryDao" class="product.InventoryDaoImpl">
        <property name="sessionFactory" ref="mySessionFactory2"/>
      </bean>  <bean id="myProductServiceTarget" class="product.ProductServiceImpl">
        <property name="productDao" ref="myProductDao"/>
        <property name="inventoryDao" ref="myInventoryDao"/>
      </bean>  <bean id="myProductService"
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="myTxManager"/>
        <property name="target" ref="myProductServiceTarget"/>
        <property name="transactionAttributes">
          <props>
            <prop key="increasePrice*">PROPAGATION_REQUIRED</prop>
            <prop key="someOtherBusinessMethod">PROPAGATION_REQUIRES_NEW</prop>
            <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
          </props>
        </property>
      </bean></beans>
      

  11.   

    sorry,的确是我的过错,虽然知道hibernate是同时支持JTA和JDBC事务的,但是我从来没有在Spring中配置过JTA事务,见笑了。