一、首先配置两个数据源(数据库)以及一个动态数据库:java
<!-- 数据源1 spring自带的 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 这里的driverClassName指的是数据库驱动这里要根据使用的数据库进行更改这里使用的SQLServer数据库 --> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property> <!-- 这里url主要说明的数据库的位置和调用那个数据库其中jdbc后面是位置而DatebaseName所说的是数据库的名称 --> <property name="url" value="jdbc:sqlserver://数据库ip地址:端口号;DatabaseName=数据库1名称;?useUnicode=true&characterEncoding=UTF-8" /> <!-- 下面的2行username和password主要是说明的登陆的用户名和密码这里根据项目的不一样进行修改 --> <property name="username" value="数据库链接帐号"></property> <property name="password" value="数据库链接密码"></property> </bean> <!-- 数据源2--> <bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 这里的driverClassName指的是数据库驱动这里要根据使用的数据库进行更改这里使用的SQLServer数据库 --> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property> <!-- 这里url主要说明的数据库的位置和调用那个数据库其中jdbc后面是位置而DatebaseName所说的是数据库的名称 --> <property name="url" value="jdbc:sqlserver://数据库ip地址:端口号;DatabaseName=数据库2名称;?useUnicode=true&characterEncoding=UTF-8" /> <!-- 下面的2行username和password主要是说明的登陆的用户名和密码这里根据项目的不一样进行修改 --> <property name="username" value="数据库链接帐号"></property> <property name="password" value="数据库链接密码"></property> </bean> <!--配置动态数据库--> <bean id="dynamicDataSource" class="com.datasource.DynamicDataSource" > <property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="dataSource" key="dataSource"></entry> <entry value-ref="dataSource2" key="dataSource2"></entry> </map> </property> <property name="defaultTargetDataSource" ref="dataSource" > </property> </bean>
二、sqlSessionFactory引用的数据库是动态数据库dynamicDataSource:spring
<!-- 扫描mybatis的配置结合上面的DataSource,会生成一个sqlFactory。这里通常来讲不用改 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dynamicDataSource" /> <!-- 将mybatis的配置文件引入 --> <property name="configLocation" value="classpath:myBatisConfig.xml"></property> </bean>
四、事务管理这里要管理的也是上面配置的dynamicDataSource动态数据库:sql
<!-- 配置了事务的管理。通常来讲不用改 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dynamicDataSource"></property> </bean>
五、写两个数据源配置类DataSourceContextHolder.java和DynamicDataSource.java来配置数据源,利用ThreadLocal解决线程安全问题。数据库
DataSourceContextHolder 类:安全
package com.datasource; public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setCustomerType(String customerType) { contextHolder.set(customerType); } public static String getCustomerType() { return contextHolder.get(); } public static void clearCustomerType() { contextHolder.remove(); } }
DynamicDataSource 类继承 AbstractRoutingDataSource,并实现determineCurrentLookupKey方法:mybatis
package com.datasource; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { // TODO 自动生成的方法存根 return null; } @Override protected Object determineCurrentLookupKey() { // TODO 自动生成的方法存根 return DataSourceContextHolder.getCustomerType(); } }
六、最后就能够在须要切换数据库的地方使用如下方法来切换数据库了,要切换的数据库名字即以前在配置动态数据库时给引用的数据库赋的名字:ide
DataSourceContextHolder.setCustomerType("要切换的数据库名字");
七、下面附上个人目录结构:sqlserver
注:每次使用完切换数据库的方法后,系统会自动切换回默认数据库,不过这之间存在一点小延迟,会出如今调用完切换数据库的方法后,马上去跳转到引用另一个数据库数据的页面,系统仍是使用着切换后的数据库。url
解决办法:能够在使用完切换数据库的方法拿到须要的数据后,再次调用 DataSourceContextHolder.setCustomerType() 方法切换回接下来须要用到的数据库。spa