SSM框架下搭建多数据源

1、配置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

2、配置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" />

3、切换数据源工具类

1.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();
	}
}
2.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();
	}
}

4、项目中使用

配置中database1 为初始化数据源,也就是项目默认使用的数据源。在需要使用另一个数据源的时候使用工具类将数据源切换为database2。
!!!注意 在使用完database2 后一定要将数据源切换回项目默认使用的database1,否则接下来的数据库操作会报错:找不到数据库表!

// 切换到数据源  database2
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_SQLSERVER2);

/* 执行数据源2的数据库操作*/

// 切回到主数据源  database1
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_SQLSERVER1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值