日期:2014-05-16  浏览次数:20695 次

spring下hibernate多数据库解决方案,以及跨库事务的尝试
spring下hibernate多数据库解决方案,以及跨库事务的尝试

相关文章: 

    spring下hibernate多数据库解决方案,以及跨库事务的尝试(二)
    Spring+Hibernate组合使用时的奇怪问题
    webwork2.2.1整合spring1.2.5遇到的问题




开发目的:一个协同平台项目,多托管用户,单门户系统,每个托管用户对应一个单一数据库,要求根据登陆用户的单位信息,自动选择操作数据库;同时,涉及跨库操作(比如跨库查询,跨库单据发送);同时事务处理必须支持这种多数据库模式,支持一些逻辑性不强的跨库事务,比如一些数据的发送和接收等<o:p></o:p>

当然,如果说跨库操作只涉及到数据的发送和接受的话,也可以通过构建专门web service以及通信线程来处理,<o:p></o:p>

开发环境: tomcat4.1,webwork<st1:chsdate month="12" islunardate="False" day="30" year="1899" w:st="on" isrocdate="False">2.2.4</st1:chsdate>,spring2.0.4,hibernate3.1,osworkflow2.8,mysql5.0.19 由于正式发布的应用服务器是weblogic8.1,所以没有采用jdk5环境以及struts2<o:p></o:p>

准备:<o:p></o:p>

问题一 由于有跨库操作,而且这种跨库操作无法预知,有的跨库操作完全是在逻辑运行中决定的,比如A托管用户或则C、D向B托管用户发了订单 ,B回复,这个回复是根据订单发送者来说的,具体到后台操作,是无法事先预知针对具体哪个后台物理数据库操作的.所以,也就是说,存在在业务执行过程中切换数据库的情况,传统的到注入设置dao类 sessionFactory、靠filter以及Interceptor设置线程安全的sessionFactory都无法完全达到设计目的<o:p></o:p>

问题二 事务,本来,我打算用JtaTransactionManager的,除了JtaTransactionManager,在开始时也实在没想到什么好的办法, 难道,JtaTransactionManager是唯一选择么?<o:p></o:p>

步骤:<o:p></o:p>

、 因为问题一,所以系统在资源方面是多sessionFactory并存的方式,也就是多少个托管用户多少个sessionFactory,当然,事实上,这种应用型项目本身并发访问量不会太高(什么,很高么,总比不过广告联盟吧,哈哈).不用担心多了几个sessionFactory会对系统或则数据库造成多大影响.<o:p></o:p>

<o:p>
xml 代码


    <bean id="mitDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
          <property name="driverClass"> 
           <value>com.mysql.jdbc.Driver</value> 
          </property> 
          <property name="jdbcUrl"> 
           <value>jdbc:mysql://127.0.0.1:3306/mitflow</value> 
          </property> 
          <property name="user"> 
           <value>root</value> 
          </property> 
        ........................... 
     </bean> 
     
    <bean id="mitSessionFactory" 
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
      <property name="mappingResources"> 
            .................................. 
        </props> 
      </property> 
       
       <property name="dataSource"> 
         <ref local="mitDataSource" /> 
       </property> 
     </bean> 


然后复制,粘贴,修改jdbcUrl,象网站编辑一样..

假设,我配置了两个sessionFatory ,一个是mitSessionFactory,一个是testSessionFactory,如下:

xml 代码

    <hibernatesupport>
    <item id="mit" bean="mitSessionFactory"/>
    <item id="test" bean="testSessionFactory"/>
  &nbs