1. 程式人生 > >spring-mybatis配置多資料來源

spring-mybatis配置多資料來源

單資料來源,就是建立一個連線池,然後在建立mybatis的SqlSessionFactoryBean時,指定這個資料來源。

多資料來源:建立多個連線池,將這多個連線池統一起來管理,通過key-value方式,我們在使用時指定哪個key,則使用哪個資料來源,我們只需要繼承spring幫我們寫好的這個類。

package cn.fzq.ds;

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

/**
 * Created by Blossom on 2018/11/13.
 */
public class DbcontextHolder extends AbstractRoutingDataSource {

    public static final String DATASOURCE = "dataSource";
    public static final String DATASOURCE_DEMO = "dataSourceDemo";

    public static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

    /**
     * 設定當前資料來源
     * @param dbType
     */
    public static void setDbType(String dbType){
        contextHolder.set(dbType);
    }
    /**
     * 獲得當前資料來源
     * @return
     */
    public static String getDbType(){
        String dbType = (String)contextHolder.get();
        return dbType;
    }
    /**
     *  清除上下文,remove掉我們此次設定的資料來源,恢復到預設資料來源
     */
    public static void clearContext(){
        contextHolder.remove();
    }
    @Override
    protected Object determineCurrentLookupKey() {
        return DbcontextHolder.getDbType();
    }
}
 <!-- 讀取config.properties檔案,配置連線池 -->
    <util:properties id="config" location="classpath:config.properties"/>

    <bean id="dataSource"  class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="#{config.classname}"/>
        <property name="url" value="#{config.url}"/>
        <property name="username"  value="#{config.username}"/>
        <property name="password" value="#{config.password}"/>
    </bean>

    <bean id="dataSourceDemo"  class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="#{config.classname}"/>
        <property name="url" value="#{config.url}"/>
        <property name="username"  value="#{config.username_demo}"/>
        <property name="password" value="#{config.password_demo}"/>
    </bean>

    <bean id="dynamicDataSource" class="cn.fzq.ds.DbcontextHolder" >
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <!--通過不同的key決定用哪個dataSource-->
                <entry value-ref="dataSource" key="dataSource"></entry>
                <entry value-ref="dataSourceDemo" key="dataSourceDemo"></entry>
            </map>
        </property>
        <!--設定預設的dataSource-->
        <property name="defaultTargetDataSource" ref="dataSource">
        </property>
    </bean>
<!-- 配置SqlSessionFactoryBean -->
	<bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 指定連線池的位置 -->
		<property name="dataSource" ref="dynamicDataSource"/>
		<!-- 指定對映檔案的位置 -->
		<property name="mapperLocations" value="classpath:cn/fzq/entity/*.xml"/>
	</bean>
	<!-- 配置MapperScannerConfigurer掃描 -->
	<!-- 指定對映器的位置 -->
	<bean id = "mapperScanner"  class = "org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name = "basePackage"  value = "cn.fzq.dao"></property>
	</bean>