因为最近公司总数据库的数据要下发到下级的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