那位有用过spring+hibernate 配置过多数据源?怎样实现多数据源之间数据共享,并且如何管理他们的事务? 最好能给我一个实例,从配置到dao实现。
  网上搜到的都是只说一点,不就一点,有的就是配置过去复习,或者实现方式不理想。我就是要找一个能实际运行的。

解决方案 »

  1.   

    网上找了一圈没找着合适的吧,其实spring参考手册上就有个听完整的例子spring+hibernate配置分布式事务,我就不给你copy了在“中间层事务访问--...--hibernate”里
      

  2.   

    晕,昨天刚回答的问题
    看这个
    http://topic.csdn.net/u/20091124/11/7e80dc5a-8447-44a5-943f-4b7d615d045b.html
      

  3.   

    终于经过本人的多次配置测试结果,最终使用了另一种方式来实现spring多数据源的配置:下面是我的配置经验,贴出来,供各位参考,我的多数据源只需要配置即可,不用像美女程序员那样还要编写程序set来set去的,麻烦。使用我的方式,你不需要修改任何代码。下面是我的详细配置:applicationContent.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
    <beans> <bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <list>
    <value>classpath:context-portal.properties</value>
    </list>
    </property>
    </bean>

    <!-- JNDI DS1 -->
    <bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName">
    <value>java:comp/env/jdbc/xxxDS1</value>
    </property>
        </bean>
        
        <!-- JNDI DS2 -->
        <bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName">
    <value>java:comp/env/jdbc/xxxDS2</value>
    </property>
        </bean> <bean id="sessionFactory1"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="dataSource1" />
    </property>
    <property name="mappingResources">
    <list>
    <!-- 权限管理 -->
    <value>hbm.group.xml</value>
    <value>hbm.group_prv.xml</value>
    <value>hbm.privilege.xml</value>
    <value>hbm.user_account.xml</value>
    <value>hbm.user_base.xml</value>
    </list>
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
    ${hibernate.dialect}
    </prop>
    <prop key="hibernate.show_sql">
    ${hibernate.show_sql}
    </prop>
    <prop key="hibernate.connection.release_mode">
    ${hibernate.connection.release_mode}
    </prop>
    <prop key="hibernate.format_sql">
    ${hibernate.format_sql}
    </prop>
    <prop key="hibernate.query.substitutions">
    ${hibernate.query.substitutions}
    </prop>
    <prop key="hibernate.jdbc.batch_size">
    ${hibernate.jdbc.batch_size}
    </prop>
    </props>
    </property>
    </bean>

    <bean id="transactionManager1"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory1" />
    </property>
    </bean> <bean id="transactionInterceptor1" abstract="true"
    class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager1" />
    <property name="transactionAttributes">
    <props>
    <prop key="*">PROPAGATION_REQUIRED</prop>
    <prop key="save*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="remove*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="update*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="insert*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="delete*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="add*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="search*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>

    <bean id="sessionFactory2"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="dataSource2" />
    </property>
    <property name="mappingResources">
    <list>
    <value>hbm.team_client_access_day_ver_change.xml</value>
    <value>hbm.team_client_access_day_ver_count.xml</value>
    <value>hbm.team_client_access_sleep30day.xml</value>
    </list>
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
    ${hibernate.dialect}
    </prop>
    <prop key="hibernate.show_sql">
    ${hibernate.show_sql}
    </prop>
    <prop key="hibernate.connection.release_mode">
    ${hibernate.connection.release_mode}
    </prop>
    <prop key="hibernate.format_sql">
    ${hibernate.format_sql}
    </prop>
    <prop key="hibernate.query.substitutions">
    ${hibernate.query.substitutions}
    </prop>
    <prop key="hibernate.jdbc.batch_size">
    ${hibernate.jdbc.batch_size}
    </prop>
    </props>
    </property>
    </bean>

    <bean id="transactionManager2"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory2" />
    </property>
    </bean> <bean id="transactionInterceptor2" abstract="true"
    class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager2" />
    <property name="transactionAttributes">
    <props>
    <prop key="*">PROPAGATION_REQUIRED</prop>
    <prop key="save*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="remove*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="update*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="insert*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="delete*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="add*">
    PROPAGATION_REQUIRED,-BaseException
    </prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="search*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>
     
    <bean
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
    <list>
    <value>*Manager,-transactionManager1</value>
    <value>*Manager,-transactionManager2</value>
    </list>
    </property>
    <property name="interceptorNames">
    <list>
    <value>transactionInterceptor1</value>
    <value>transactionInterceptor2</value>
    </list>
    </property>
    </bean>

    <!-- local DS 这种方式只适用单数据源,这里暂保留记录  
    <bean id="dataSourceJDBC"
    class="org.logicalcobwebs.proxool.ProxoolDataSource">
    <property name="driver" value="${datasource.driverClassName}" />
    <property name="driverUrl" value="${datasource.url}" />
    <property name="user" value="${datasource.username}" />
    <property name="password" value="${datasource.password}" />
    <property name="houseKeepingTestSql"
    value="${datasource.houseKeepingTestSql}" />
    <property name="maximumConnectionCount"
    value="${datasource.maximumConnectionCount}" />
    <property name="minimumConnectionCount"
    value="${datasource.minimumConnectionCount}" />
    <property name="delegateProperties"
    value="characterEncoding=gbk" />
    </bean>
    -->

    <!-- DAO的配置-->
    <bean id="userDao" class="XXX.UserManageDaoImpl">
    <property name="sessionFactory" ref="sessionFactory1"></property>
    </bean>

    <bean id="logsDao" class="XXX.LogsDaoImpl">
    <property name="sessionFactory" ref="sessionFactory2"></property>
    </bean>

    <!--Service的配置-->
    <bean name="userService" class="XXX.UserManageServiceImpl">
    <property name="dao" ref="userDao"></property>
    </bean>
    <bean name="logsService" class="XXX.LogsServiceImpl">
    <property name="dao" ref="logsDao"></property>
    </bean>

    <!-- action的配置-->
    <bean id="userAction" class="XXX.UserAction"
    scope="prototype">
    <property name="userService">
    <ref bean="userService" />
    </property>
    </bean>

    <bean id="logsAction" class="XXX.LogsAction"
    scope="prototype">
    <property name="logsService">
    <ref bean="logsService" />
    </property>
    </bean>

    </beans>这个就是一个完整的配置了,你的实现代码跟你使用单数据源的代码一样。只是你调用时使用不同的dao即可使用不同的数据源了。这里一定要注意,数据源一定要配置JNDI的方式,使用其它JDBC的方式都无法识别不同的数据源。这个也是我配置多次失败的原因。配置JNDI的方法也很简单,如使用TOMCAT的配置方法是,打开%TOMCAT_HOME%\conf\content.xml文件。
    加入如下结点,即可完成JNDI的配置:
    <Resource name="jdbc/XXXDS1" auth="Container" type="javax.sql.DataSource"
                   maxActive="100" maxIdle="30" maxWait="10000"
                   username="xx" password="xx" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                   url="jdbc:sqlserver://XX.XX.XX.XXX:1433;databaseName=XXX;"/>

    <Resource name="jdbc/XXXDS2" auth="Container" type="javax.sql.DataSource"
                   maxActive="100" maxIdle="30" maxWait="10000"
                   username="xx" password="xx" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                   url="jdbc:sqlserver://XX.XX.XX.XX:1433;databaseName=XXX;"/>本贴终于解决了网上搜了一大把关于这个问题,都是说了一大堆废话,而实际根本看了不知如何下手的误区(网上说了一大堆,都是说了一点不说一点。越看越晕。)。同时也解决了多数据源事务处理的问题(各个数据源独自处理自已的事务。)。希望能对各位遇到该问题的朋友有用。
      

  4.   

       smith_cht 所说:同时也解决了多数据源事务处理的问题(各个数据源独自处理自已的事务。)这样是没有办法  实现多数据源之间数据共享,并且管理他们事务的。多数据源的事务控制必须使用 jta 在  http://blog.sina.com.cn/bllms   有我的文章 tomcat 使用jotm支持jta里面详细说明如何使用 jotm支持jta ,当然 也不是非要使用jotm ,也可以手动 写jta 的代码。
    但是 smith_cht 已经使用了 spring ,那么使用 事务拦截也是顺理成章的。而且也提供了对jotm的支持!
    对原来的代码也影响很小!
      

  5.   

    见过相同的问题,在这里
    Spring 与 Hibernate 配置多数据源

    spring和hibernate配置两个数据源问题