首页 > 代码库 > spring基于通用Dao的多数据源配置

spring基于通用Dao的多数据源配置

有时候在一个项目中会连接多个数据库,须要在spring中配置多个数据源,近期就遇到了这个问题,因为我的项目之前是基于通用Dao的,配置的时候问题不断。这样的方式和资源文件冲突;扫描映射文件的话,SqlSessionFactory的bean名字必须是sqlSessionFactory 他读不到sqlSessioNFactory2或者其它名字,终于解决方法例如以下:

1.在项目中增加例如以下类MultipleDataSource.java

package com.etoak.util;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class MultipleDataSource extends AbstractRoutingDataSource {
	
	private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();

    public static void setDataSourceKey(String dataSource) {
        dataSourceKey.set(dataSource);
    }
	@Override
	protected Object determineCurrentLookupKey() {
		// TODO Auto-generated method stub
		return dataSourceKey.get();
	}

}

spring配置文件例如以下:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

	<context:component-scan base-package="com"/>
	
	<mvc:annotation-driven/>
	

	<context:property-placeholder location="classpath:db.properties"/>
	<bean id="ds1" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
		p:driverClassName="${mysql.driver}"
		p:url="${mysql.url}"
		p:username="${mysql.username}"
		p:password="${mysql.password}"/>
	<bean id="ds2" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
		p:driverClassName="${mysql2.driver}"
		p:url="${mysql2.url}"
		p:username="${mysql2.username}"
		p:password="${mysql2.password}"/>
	
	
	<bean id="multipleDataSource" class="com.etoak.util.MultipleDataSource">
        <property name="defaultTargetDataSource" ref="ds1"/>
        <property name="targetDataSources">
            <map>
                <entry key="ds1" value-ref="ds1"/>
                <entry key="ds2" value-ref="ds2"/>
            </map>
        </property>
    </bean>
	
	<bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean"
		p:dataSource-ref="multipleDataSource"
		p:mapperLocations="classpath:com/etoak/dao/*-mapper.xml"/>
	
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value=http://www.mamicode.com/"com.etoak.dao"/>>測试类例如以下:

package com.etoak.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.etoak.dao.ProductDaoIf;
import com.etoak.util.MultipleDataSource;

public class Test {

	public static void main(String[] args) {
		ApplicationContext ac = new 
			FileSystemXmlApplicationContext("WebContent/WEB-INF/etoak-servlet.xml");
		
		ProductDaoIf proDao = (ProductDaoIf)ac.getBean(ProductDaoIf.class);
		
		MultipleDataSource.setDataSourceKey("ds1");
		int count1 = proDao.selectProductCount();
		MultipleDataSource.setDataSourceKey("ds2");
		int count2 = proDao.selectProductCount();
		System.out.println(count1);
		System.out.println(count2);
	}

}



spring基于通用Dao的多数据源配置