求spring+hibernate配置多数据源

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

...全文
1147 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
liminshuai 2010-01-06
  • 打赏
  • 举报
回复
smith_cht 所说:同时也解决了多数据源事务处理的问题(各个数据源独自处理自已的事务。)

这样是没有办法 实现多数据源之间数据共享,并且管理他们事务的。

多数据源的事务控制必须使用 jta

http://blog.sina.com.cn/bllms 有我的文章 tomcat 使用jotm支持jta

里面详细说明如何使用 jotm支持jta ,当然 也不是非要使用jotm ,也可以手动 写jta 的代码。
但是 smith_cht 已经使用了 spring ,那么使用 事务拦截也是顺理成章的。而且也提供了对jotm的支持!
对原来的代码也影响很小!
smith_cht 2009-11-29
  • 打赏
  • 举报
回复
终于经过本人的多次配置测试结果,最终使用了另一种方式来实现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;"/>

本贴终于解决了网上搜了一大把关于这个问题,都是说了一大堆废话,而实际根本看了不知如何下手的误区(网上说了一大堆,都是说了一点不说一点。越看越晕。)。同时也解决了多数据源事务处理的问题(各个数据源独自处理自已的事务。)。希望能对各位遇到该问题的朋友有用。
道光2008 2009-11-25
  • 打赏
  • 举报
回复
晕,昨天刚回答的问题
看这个
http://topic.csdn.net/u/20091124/11/7e80dc5a-8447-44a5-943f-4b7d615d045b.html
smith_cht 2009-11-24
  • 打赏
  • 举报
回复
谢谢你的提醒。我找找看。
Landor2004 2009-11-24
  • 打赏
  • 举报
回复
网上找了一圈没找着合适的吧,其实spring参考手册上就有个听完整的例子

spring+hibernate配置分布式事务,我就不给你copy了

在“中间层事务访问--...--hibernate”里

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧