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

来源:互联网 发布:淘宝客服流程入门教程 编辑:程序博客网 时间:2024/05/16 17:06

因为最近公司总数据库的数据要下发到下级的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 {@Overrideprotected Object determineCurrentLookupKey() {DBType key=ContextHolder.getDbType();return key;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {// TODO Auto-generated method stubreturn 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
原创粉丝点击