spring+struts2+hibernate3同时操作多个数据库,具体点就是同时从多个不同的数据库中查询数据显示在页面上。 
这里设计到多个数据源。可不可以这样在applicationcontext.xml中配置多个sessionfactory和多个datasource? 
在后台怎样获取所有数据库的所有session呢? 
事物又怎么配置? 
是不是还得应用多线程呢? 
如果能给出例子,将不胜感激!

解决方案 »

  1.   

     <!--1、Oracle 数据源配置-->      
      <bean id="oraclesessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">      
        <property name="configLocation">      
          <value>WEB-INF/classes/oracle-h.cfg.xml</value>      
        </property>      
      </bean>      
      <bean id="oracletransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">      
        <property name="sessionFactory">      
          <ref local="sessionFactory" />      
        </property>      
      </bean>      
    <!--2、SQLServer 数据源配置-->      
      <bean id="sqlServersessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">      
        <property name="configLocation">      
          <value>WEB-INF/classes/sqlserver-h.cfg.xml</value>      
        </property>      
      </bean>      
      <bean id="sqlServerTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">      
        <property name="sessionFactory">      
          <ref local="sqlServersessionFactory" />      
        </property>      
      </bean>      
    <!--3、其他数据源配置-->      
      

  2.   

    关联Session的时候,主要是从sessionFactory中去关联
    1楼的做法正确~
      

  3.   

    oracle的话创建一个database link就可以
    创建一个session就可以访问多个数据库
      

  4.   

    <!--1、Oracle 数据源配置-->      
      <bean id="oraclesessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">      
        <property name="configLocation">      
          <value>WEB-INF/classes/oracle-h.cfg.xml</value>      
        </property>      
      </bean>      
      <bean id="oracletransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">      
        <property name="sessionFactory">      
          <ref local="sessionFactory" />      
        </property>      
      </bean>      
    <!--2、SQLServer 数据源配置-->      
      <bean id="sqlServersessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">      
        <property name="configLocation">      
          <value>WEB-INF/classes/sqlserver-h.cfg.xml</value>      
        </property>      
      </bean>      
      <bean id="sqlServerTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">      
        <property name="sessionFactory">      
          <ref local="sqlServersessionFactory" />      
        </property>      
      </bean>      
    <!--3、其他数据源配置-->      
      

  5.   

    请问WEB-INF/classes/oracle-h.cfg.xml这里的oracle-h.cfg.xml要自己新建文件写配置是吗?
      

  6.   

    hibernate ,生成关系映射文件(类),你在关系映射文件中看,是不是你的类已经标识了,某一个库,所以不用配置多个Sessionfactory,hibernate会自动识别的,我之前试过,你在试试!
      

  7.   

    偶有一个例子,都是用mysql,不过是不同的数据库。。<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1/test"/>
    <property name="username" value="root"/>
    <property name="password" value="76554792"/>
    </bean> <bean id="dangdangDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1/dangdang"/>
    <property name="username" value="root"/>
    <property name="password" value="76554792"/>
    </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hibernate.current_session_context_class">thread</prop>
    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
    </props>
    </property>
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean>
    <bean id="dangdangSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dangdangDataSource"/>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hibernate.current_session_context_class">thread</prop>
    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
    </props>
    </property>
    <property name="configLocation">
    <value>classpath:hibernate.dangdang.cfg.xml</value>
    </property>
    </bean> <bean name="dangdangDAO" class="dangdangdao.DangdangDAO">
    <property name="dangdangSessionFactory" ref="dangdangSessionFactory"/>
    </bean> <bean name="testDAO" class="dao.TestDAO">
    <property name="sessionFactory" ref="sessionFactory"/>
    </bean> <bean name="dangdangService" class="dangdangservice.DangdangService">
    <property name="dangdangDAO" ref="dangdangDAO"/>
    </bean> <bean name="testService" class="service.TestService">
    <property name="testDAO" ref="testDAO"/>
    <property name="test1Service" ref="test1Service"/>
    </bean>

    <bean name="test1Service" class="service.Test1Service">
    <property name="testDAO" ref="testDAO"/>
    </bean> <bean name="/test" class="action.TestAction">
    <property name="testService" ref="testService"/>
    <property name="test1Service" ref="test1Service"/>
    <property name="dangdangService" ref="dangdangService"/>
    </bean>
        
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
        
        <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
            <property name="transactionManager" ref="transactionManager" />
            <property name="transactionAttributes">
                <props>    
                    <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>        
                    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                    <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
                    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                </props>
            </property>
        </bean>
        
    <bean id="transactionAdvisor" class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
            <property name="transactionInterceptor" ref="transactionInterceptor" />
        </bean>
        
        <bean id="beanproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
            <property name="beanNames">
                <value>*Service</value>
            </property>
            <property name="interceptorNames">
                <list>
                    <value>transactionAdvisor</value>
                </list>
            </property>
        </bean>
        
        
        <bean id="dangdangTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="dangdangSessionFactory"/>
    </bean>
        
        <bean id="dangdangTransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
            <property name="transactionManager" ref="dangdangTransactionManager" />
            <property name="transactionAttributes">
                <props>    
                    <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>        
                    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                    <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
                    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                </props>
            </property>
        </bean>
        
    <bean id="dangdangTransactionAdvisor" class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
            <property name="transactionInterceptor" ref="dangdangTransactionInterceptor" />
        </bean>
        
        <bean id="dangdangbeanproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
            <property name="beanNames">
                <value>*DangdangService</value>
            </property>
            <property name="interceptorNames">
                <list>
                    <value>dangdangTransactionAdvisor</value>
                </list>
            </property>
        </bean></beans>