码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-07-03 19:08:18      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:多数据源   xsd   text   file   扫描   多个   extend   schema   protected   

有时候在一个项目中会连接多个数据库,须要在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="com.etoak.dao"/>
                <property name="markerInterface" value="com.etoak.dao.BaseDao" />
	</bean>
	
	
	
</beans>










測试类例如以下:

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的多数据源配置

标签:多数据源   xsd   text   file   扫描   多个   extend   schema   protected   

原文地址:http://www.cnblogs.com/mthoutai/p/7112475.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!