1,通过继承 spring 自带的 AbstractRoutingDataSource 方法 来 进行 数据源切换
DbContextHolder 实现类
1 public class DbContextHolder extends AbstractRoutingDataSource{ 2 3 public static final String DATA_SOURCE_DEFA = "dataSource1"; 4 public static final String DATA_SOURCE_FLOW = "dataSource2"; 5 6 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); 7 8 /** 9 * 设置当前数据库。 10 * @param dbType 11 */ 12 public static void setDbType(String dbType) 13 { 14 contextHolder.set(dbType); 15 } 16 17 /** 18 * 取得当前数据源。 19 * @return 20 */ 21 public static String getDbType() 22 { 23 String str = (String) contextHolder.get(); 24 return str; 25 } 26 27 /** 28 * 清除上下文数据 29 */ 30 public static void clearDbType() 31 { 32 contextHolder.remove(); 33 } 34 35 @Override 36 protected Object determineCurrentLookupKey() { 37 // TODO Auto-generated method stub 38 return DbContextHolder.getDbType(); 39 } 40 41 }
在 spring+ Mybatis 的数据源配置文件 中添加 dynamicDataSource 的切换方法
这里通过JNDI 方式 获取数据源
1 <bean id="dynamicDataSource" class="com.want.search.util.DbContextHolder" > 2 <property name="targetDataSources"> 3 <map key-type="java.lang.String"> 4 <!--通过不同的key决定用哪个dataSource--> 5 <entry value-ref="dataSource1" key="dataSource1"></entry> 6 <entry value-ref="dataSource2" key="dataSource2"></entry> 7 </map> 8 </property> 9 <!--设置默认的dataSource--> 10 <property name="defaultTargetDataSource" ref="dataSource1"></property> 11 </bean> 12 13 14 15 <bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean"> 16 <property name="jndiName"><value>jdbc/SignBPM</value></property> 17 </bean> 18 19 <bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean"> 20 <property name="jndiName"><value>jdbc/bpmflow</value></property> 21 </bean>
在使用 切换数据源时的方法
1 DbContextHolder.setDbType(DbContextHolder.DATA_SOURCE_FLOW);
2 ,通过 spring +mybatis 中配置 多个SqlSessionFactoryTemp 来获得 不同的SqlSession 对象 来操作 不同 的数据库
1 <!-- DBCP数据源的配置 bpmuser schema--> 2 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 3 destroy-method="close"> 4 <property name="driverClassName" value="${jdbc1.driver}" /> 5 <property name="url" value="${jdbc1.url}" /> 6 <property name="username" value="${jdbc1.username}" /> 7 <property name="password" value="${jdbc1.password}" /> 8 <!-- 初始化连接大小 --> 9 <property name="initialSize" value="${initialSize}"></property> 10 <!-- 连接池最大数量 --> 11 <property name="maxActive" value="${maxActive}"></property> 12 <!-- 连接池最大空闲 --> 13 <property name="maxIdle" value="${maxIdle}"></property> 14 <!-- 连接池最小空闲 --> 15 <property name="minIdle" value="${minIdle}"></property> 16 <!-- 获取连接最大等待时间 --> 17 <property name="maxWait" value="${maxWait}"></property> 18 </bean> 19 20 21 <!-- DBCP数据源的配置 bpmuer2 schema --> 22 <bean id="dataSourceEx" class="org.apache.commons.dbcp.BasicDataSource" 23 destroy-method="close"> 24 <property name="driverClassName" value="${jdbc2.driver}" /> 25 <property name="url" value="${jdbc2.url}" /> 26 <property name="username" value="${jdbc2.username}" /> 27 <property name="password" value="${jdbc2.password}" /> 28 <!-- 初始化连接大小 --> 29 <property name="initialSize" value="${initialSize}"></property> 30 <!-- 连接池最大数量 --> 31 <property name="maxActive" value="${maxActive}"></property> 32 <!-- 连接池最大空闲 --> 33 <property name="maxIdle" value="${maxIdle}"></property> 34 <!-- 连接池最小空闲 --> 35 <property name="minIdle" value="${minIdle}"></property> 36 <!-- 获取连接最大等待时间 --> 37 <property name="maxWait" value="${maxWait}"></property> 38 </bean> 39 40 41 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 42 <property name="dataSource" ref="dataSource" /> 43 <!-- 自动扫描mapper.xml文件 --> 44 <property name="mapperLocations" value="classpath:com/sun/search/mapper/*.xml"></property> 45 </bean> 46 47 <bean id="sqlSessionFactoryEx" class="org.mybatis.spring.SqlSessionFactoryBean"> 48 <property name="dataSource" ref="dataSourceEx" /> 49 <!-- mapper扫描 --> 50 <property name="mapperLocations" value="classpath:com/sun/search/mapper/*.xml"></property> 51 </bean> 52 53 <!-- 获取 sqlSessionTemplate 对象--> 54 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> 55 <constructor-arg ref="sqlSessionFactory" /> 56 </bean> 57 58 <!-- 获取 sqlSessionTemplateEx 对象--> 59 <bean id="sqlSessionEx" class="org.mybatis.spring.SqlSessionTemplate"> 60 <constructor-arg ref="sqlSessionFactoryEx" /> 61 </bean> 62 63 64 <!-- bpmuser schema (事务管理) --> 65 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 66 <property name="dataSource" ref="dataSource" /> 67 </bean> 68 69 <!-- bpmuser2 schema (事务管理) --> 70 <bean name="transactionManagerEx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 71 <property name="dataSource" ref="dataSourceEx"></property> 72 </bean>
这样写的话要实现 dao 层 通过不同的Sqlsession 来操作 不同的数据源 ,不能直接通过Spring 来直接将Dao接口注入到service层
1 @Repository 2 public class FormInfoMapperImpl implements FormInfoMapper{ 3 4 private static Log logger =LogFactory.getLog(FormInfoMapperImpl.class); 5 6 @Autowired 7 private SqlSession sqlSession; 8 9 @Autowired 10 private SqlSession sqlSessionEx;