• 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="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);
    	}
    
    }
    



  • 相关阅读:
    【未完成0.0】Noip2012提高组day2 解题报告
    【数论+技巧】神奇的Noip模拟试题第二试 T1 素数统计
    Noip2014 提高组 T2 联合权值 连通图+技巧
    Noip2014 提高组 day1 T1· 生活大爆炸版石头剪刀布
    神奇的Noip模拟试题 T3 科技节 位运算
    博客小谈
    神奇的Noip模拟试题一试 2 排队
    神奇的Noip模拟试题第一试 合理种植 枚举+技巧
    使用Desktop App Converter打包桌面应用程序
    Rust Linking With C Library Functions
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7112475.html
Copyright © 2020-2023  润新知