动态切换数据源(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
- 动态切换数据源(spring3.0+hibernate3.0)
- Spring3 Annotation + Hibernate3-jpa2.0 + CGLIB + 多数据源(动态数据源)
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
- Spring3 整合Hibernate3.5 动态切换SessionFactory
- Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)
- Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)
- UVA10361转化思想使代码更加简洁
- POJ 1486 (2分匹配 必须变判断)
- 【memcache/redis】memcache常见问题汇总
- Xcode6模拟器app和文件在哪儿?
- poj 2352
- 动态切换数据源(spring3.0+hibernate3.0)
- ORACLE 函数VARCHAR2参数不能指定长度
- JDK的组成:Client Hotspot VM 与Server Hotspot VM 的区别 ???
- Obj-C中的@class
- Algorithms—138.Copy List with Random Pointer
- 正则表达式
- onmouse onkeypress and so on
- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element
- C#数据类型对应数据库字段类型