动态切换数据源(spring3.0+hibernate3.0)

因为最近公司总数据库的数据要下发到下级的10个数据库中,在spring注入10个sessionFactory明显是不可取的,spring2.5以上已经实现了动态切换数据源(org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource)

步骤:  我用的是jdk1.6版本,所以为了能顺利实现,建议使用1.6或1.6以上jdk

1.首先创建一个枚举类以我10个数据源切换为例

package com.bsoft.utils;

public enum DBType {
	
	PHSDataSource00,PHSDataSource01,
	PHSDataSource02,PHSDataSource03,
	PHSDataSource04,PHSDataSource05,
	PHSDataSource06,PHSDataSource07,
	PHSDataSource08,PHSDataSource09;
	
	

}



2.然后创建一s个用于切换数据源的工具类

package com.bsoft.utils;

public class ContextHolder {
	private static ThreadLocal<Object> holder=new ThreadLocal<Object>();
	
	 public static void setDbType(DBType dbType) {
	        holder.set(dbType);
	    }
	 public static DBType getDbType(){
		 return (DBType)holder.get();
	 }
	 public void cleanDbType(){
		 holder.remove();
	 }
}



3.创建动态数据源,继承org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource

import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {

	@Override
	protected Object determineCurrentLookupKey() {
		DBType key=ContextHolder.getDbType();
		return key;
	}

	@Override
	public Logger getParentLogger() throws SQLFeatureNotSupportedException {
		// TODO Auto-generated method stub
		return null;
	}

}



4.在spring配置文件中配置数据源

 <!--数据源 平湖分局00 -->
        
         <bean id="PHSDataSource00" class="org.apache.commons.dbcp.BasicDataSource">
         <property name="driverClassName" value="${dataSourcePHS00.driverClassName}"></property>
         <property name="url" value="${dataSourcePHS00.url}"></property>
         <property name="username" value="${dataSourcePHS00.userName}"></property>
         <property name="password" value="${dataSourcePHS00.password}"></property>
         </bean>
         <!--数据源 平湖分局01 -->
        
         <bean id="PHSDataSource01" class="org.apache.commons.dbcp.BasicDataSource">
         <property name="driverClassName" value="${dataSourcePHS01.driverClassName}"></property>
         <property name="url" value="${dataSourcePHS01.url}"></property>
         <property name="username" value="${dataSourcePHS01.userName}"></property>
         <property name="password" value="${dataSourcePHS01.password}"></property>
         </bean>
         <!--数据源 平湖分局02 -->

................

 <!-- 动态数据源配置 -->
         <bean id="DynamicDataSource" class="com.bsoft.utils.DynamicDataSource">
         <property name="targetDataSources">
         <map key-type="com.bsoft.utils.DBType">
         <entry key="PHSDataSource00" value-ref="PHSDataSource00"></entry>
         <entry key="PHSDataSource01" value-ref="PHSDataSource01"></entry>
         <entry key="PHSDataSource02" value-ref="PHSDataSource02"></entry>
         <entry key="PHSDataSource03" value-ref="PHSDataSource03"></entry>
         <entry key="PHSDataSource04" value-ref="PHSDataSource04"></entry>
         <entry key="PHSDataSource05" value-ref="PHSDataSource05"></entry>
         <entry key="PHSDataSource06" value-ref="PHSDataSource06"></entry>
         <entry key="PHSDataSource07" value-ref="PHSDataSource07"></entry>
         <entry key="PHSDataSource08" value-ref="PHSDataSource08"></entry>
         <entry key="PHSDataSource09" value-ref="PHSDataSource09"></entry>
         </map>
         </property>
         <property name="defaultTargetDataSource" ref="PHSDataSource00"/>
         </bean>

  <!-- 动态切换session -->
         <bean id="DynamicSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
         <property name="dataSource">
         <ref bean="DynamicDataSource"/>
         </property>
         <property name="hibernateProperties">
         <props>
         <prop key="hibernate.dialect">
			org.hibernate.dialect.Oracle10gDialect
		 </prop>
		 <prop key="hibernate.show_sql">false</prop>
		 <prop key="hibernate.format_sql">true</prop>
		 <prop key="hibernate.hbm2ddl.auto">update</prop>
         </props>
         </property>
         <property name="packagesToScan">
         <list><value>com.bsoft.entity</value></list>
         </property>
         </bean>




配置将sessionFactory注入到dao层

   <bean id="timerDao" class="com.bsoft.dao.TimerDao">
         
         <property name="DynamicSessionFactory">
         <ref local="DynamicSessionFactory"/>
         </property>
         
         </bean>



5.dao层切换数据源

 if(dynasicSession!=null){
		dynasicSession.close();
				}
	 ContextHolder.setDbType(DBType.PHSDataSource00); //设定该数据源为妇保所社区卫生服务中心数据源
		 dynasicSession=getDynamicSessionFactory().openSession();

 if(dynasicSession!=null){
		dynasicSession.close();
				}
	 ContextHolder.setDbType(DBType.PHSDataSource01); 
<pre name="code" class="html"> dynasicSession=getDynamicSessionFactory().openSession();

 ............... 



...............

这样就实现了动态数据源的切换,附上源码一份,希望大家都能顺利实现!源码百度云盘分享http://pan.baidu.com/s/1dDFCZC1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值