配置properties文件数据源信息
#[database1]
db.driver1=net.sf.log4jdbc.DriverSpy
db.url1=jdbc\:log4jdbc\:sqlserver\://localhost;DatabaseName\=DB1
db.username1=root
db.password1=123456
db.initialSize1=0
db.maxActive1=20
db.maxIdle1=20
db.minIdle1=1
db.maxWait1=60000
#[database2]
db.driver2=net.sf.log4jdbc.DriverSpy
db.url2=jdbc\:log4jdbc\:sqlserver\://localhost;DatabaseName\=DB2
db.username2=root
db.password2=123456
db.initialSize2=0
db.maxActive2=20
db.maxIdle2=20
db.minIdle2=1
db.maxWait2=60000
配置spring-mybatis.xml文件
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{sysconfig['db.driver1']}" />
<property name="url" value="#{sysconfig['db.url1']}" />
<property name="username" value="#{sysconfig['db.username1']}" />
<property name="password" value="#{sysconfig['db.password1']}" />
<property name="initialSize" value="#{sysconfig['db.initialSize1']}"></property>
<property name="maxActive" value="#{sysconfig['db.maxActive1']}"></property>
<property name="maxIdle" value="#{sysconfig['db.maxIdle1']}"></property>
<property name="minIdle" value="#{sysconfig['db.minIdle1']}"></property>
<property name="maxWait" value="#{sysconfig['db.maxWait1']}"></property>
</bean>
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{sysconfig['db.driver2']}" />
<property name="url" value="#{sysconfig['db.url2']}" />
<property name="username" value="#{sysconfig['db.username2']}" />
<property name="password" value="#{sysconfig['db.password2']}" />
<property name="initialSize" value="#{sysconfig['db.initialSize2']}"></property>
<property name="maxActive" value="#{sysconfig['db.maxActive2']}"></property>
<property name="maxIdle" value="#{sysconfig['db.maxIdle2']}"></property>
<property name="minIdle" value="#{sysconfig['db.minIdle2']}"></property>
<property name="maxWait" value="#{sysconfig['db.maxWait2']}"></property>
</bean>
<bean id="multipleDataSource" class="cn.iot.utils.DbcontextHolder">
<property name="defaultTargetDataSource" ref="dataSource1" />
<property name="targetDataSources">
<map>
<entry key="dataSource1" value-ref="dataSource"/>
<entry key="dataSource2" value-ref="dataSource2"/>
</map>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="multipleDataSource" />
<property name="mapperLocations" value="classpath*:cn/iot/tx/mapper/sqlmapper/*.xml" />
<property name="configLocation" value="classpath:/mybatis-config.xml"></property>
<!-- 配置分页拦截器 -->
<property name="typeAliasesPackage" value="com.isea533.ssm.model"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageHelper">
<property name="properties">
<value>
<!-- //dialect=sqlserver -->
<!-- //reasonable=true -->
</value>
</property>
</bean>
</array>
</property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.iot.tx.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!-- [事务管理]transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="multipleDataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
切换数据源工具类
CustomerContextHolder.java
import org.apache.axis.utils.StringUtils;
public class CustomerContextHolder {
public static final String DATA_SOURCE_SQLSERVER1 = "dataSource1";
public static final String DATA_SOURCE_SQLSERVER2 = "dataSource2";
// 用ThreadLocal来设置当前线程使用哪个dataSource
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setCustomerType(String customerType) {
contextHolder.set(customerType);
}
public static String getCustomerType() {
String dataSource = contextHolder.get();
if (StringUtils.isEmpty(dataSource)) {
return DATA_SOURCE_SQLSERVER;
} else {
return dataSource;
}
}
public static void clearCustomerType() {
contextHolder.remove();
}
}
DbcontextHolder.java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DbcontextHolder extends AbstractRoutingDataSource {
private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();
@Override
protected Object determineCurrentLookupKey() {
return CustomerContextHolder.getCustomerType();
}
protected void decmineCurrentLookupKey() {
CustomerContextHolder.clearCustomerType();
}
}
项目中使用
配置中database1 为初始化数据源,也就是项目默认使用的数据源。在需要使用另一个数据源的时候使用工具类将数据源切换为database2。
!!!注意 在使用完database2 后一定要将数据源切换回项目默认使用的database1,否则接下来的数据库操作会报错:找不到数据库表!
// 切换到数据源 database2
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_SQLSERVER2);
/* 执行数据源2的数据库操作*/
// 切回到主数据源 database1
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_SQLSERVER1);
转载来源:https://blog.youkuaiyun.com/cc_1209/article/details/85291485