求spring+hibernate配置多数据源 那位有用过spring+hibernate 配置过多数据源?怎样实现多数据源之间数据共享,并且如何管理他们的事务? 最好能给我一个实例,从配置到dao实现。 网上搜到的都是只说一点,不就一点,有的就是配置过去复习,或者实现方式不理想。我就是要找一个能实际运行的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 网上找了一圈没找着合适的吧,其实spring参考手册上就有个听完整的例子spring+hibernate配置分布式事务,我就不给你copy了在“中间层事务访问--...--hibernate”里 晕,昨天刚回答的问题看这个http://topic.csdn.net/u/20091124/11/7e80dc5a-8447-44a5-943f-4b7d615d045b.html 终于经过本人的多次配置测试结果,最终使用了另一种方式来实现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;"/>本贴终于解决了网上搜了一大把关于这个问题,都是说了一大堆废话,而实际根本看了不知如何下手的误区(网上说了一大堆,都是说了一点不说一点。越看越晕。)。同时也解决了多数据源事务处理的问题(各个数据源独自处理自已的事务。)。希望能对各位遇到该问题的朋友有用。 smith_cht 所说:同时也解决了多数据源事务处理的问题(各个数据源独自处理自已的事务。)这样是没有办法 实现多数据源之间数据共享,并且管理他们事务的。多数据源的事务控制必须使用 jta 在 http://blog.sina.com.cn/bllms 有我的文章 tomcat 使用jotm支持jta里面详细说明如何使用 jotm支持jta ,当然 也不是非要使用jotm ,也可以手动 写jta 的代码。但是 smith_cht 已经使用了 spring ,那么使用 事务拦截也是顺理成章的。而且也提供了对jotm的支持!对原来的代码也影响很小! 见过相同的问题,在这里Spring 与 Hibernate 配置多数据源 和 spring和hibernate配置两个数据源问题 随机数生成 Weblogic域间调用EJB事务错误 急!!用hibernate无法生成映射文件 Xfire建立webservice的问题 关于ssh的框架的问题 dom添加xml节点无法加入的问题 用Ant 初始化数据库 一个关于JTree的用法问题,请高手指点迷津 请问lookup问题 web.xml 中加载properties文件 从属性文件取值 hibernate对多数据源的支持 Spring AOP
看这个
http://topic.csdn.net/u/20091124/11/7e80dc5a-8447-44a5-943f-4b7d615d045b.html
<?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;"/>本贴终于解决了网上搜了一大把关于这个问题,都是说了一大堆废话,而实际根本看了不知如何下手的误区(网上说了一大堆,都是说了一点不说一点。越看越晕。)。同时也解决了多数据源事务处理的问题(各个数据源独自处理自已的事务。)。希望能对各位遇到该问题的朋友有用。
但是 smith_cht 已经使用了 spring ,那么使用 事务拦截也是顺理成章的。而且也提供了对jotm的支持!
对原来的代码也影响很小!
Spring 与 Hibernate 配置多数据源 和
spring和hibernate配置两个数据源问题