1. 程式人生 > >Spring+Mybatis+MySql雙資料來源配置(手動切換資料來源)

Spring+Mybatis+MySql雙資料來源配置(手動切換資料來源)

直接上程式碼。

.properties資原始檔,資料來源的配置項直接從這裡讀取

jdbc_driverClassName=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://xxx.xx.x.xxx:xxxx/gic?useUnicode=true&characterEncoding=utf-8
jdbc_username=gic
[email protected]

jdbc_driverClassName_uic=com.mysql.jdbc.Driver
jdbc_url_uic=jdbc:mysql://xxx.xx.x.xxx
:xxxx/uic?useUnicode=true&characterEncoding=utf-8 jdbc_username_uic=uic [email protected]

第一個
dataSource資料來源

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        init-method="init" destroy-method="close">
        <property name="driverClassName">
            <value
>
${jdbc_driverClassName}</value> </property> <property name="url"> <value>${jdbc_url}</value> </property> <property name="username"> <value>${jdbc_username}</value> </property> <property
name="password">
<value>${jdbc_password}</value> </property> <!-- 連線池最大使用連線數 --> <property name="maxActive"> <value>20</value> </property> <!-- 初始化連線大小 --> <property name="initialSize"> <value>1</value> </property> <!-- 獲取連線最大等待時間 --> <property name="maxWait"> <value>60000</value> </property> <!-- 連線池最大空閒 --> <property name="maxIdle"> <value>20</value> </property> <!-- 連線池最小空閒 --> <property name="minIdle"> <value>3</value> </property> <!-- 自動清除無用連線 --> <property name="removeAbandoned"> <value>true</value> </property> <!-- 清除無用連線的等待時間 --> <property name="removeAbandonedTimeout"> <value>180</value> </property> <!-- 連線屬性 --> <property name="connectionProperties"> <value>clientEncoding=UTF-8</value> </property> </bean>

第二個

<bean id="dataSource_uic" class="com.alibaba.druid.pool.DruidDataSource"
        init-method="init" destroy-method="close">
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>${jdbc_url_uic}</value>
        </property>
        <property name="username">
            <value>${jdbc_username_uic}</value>
        </property>
        <property name="password">
            <value>${jdbc_password_uic}</value>
        </property>
        <!-- 連線池最大使用連線數 -->
        <property name="maxActive">
            <value>20</value>
        </property>
        <!-- 初始化連線大小 -->
        <property name="initialSize">
            <value>1</value>
        </property>
        <!-- 獲取連線最大等待時間 -->
        <property name="maxWait">
            <value>60000</value>
        </property>
        <!-- 連線池最大空閒 -->
        <property name="maxIdle">
            <value>20</value>
        </property>
        <!-- 連線池最小空閒 -->
        <property name="minIdle">
            <value>3</value>
        </property>
        <!-- 自動清除無用連線 -->
        <property name="removeAbandoned">
            <value>true</value>
        </property>
        <!-- 清除無用連線的等待時間 -->
        <property name="removeAbandonedTimeout">
            <value>180</value>
        </property>
        <!-- 連線屬性 -->
        <property name="connectionProperties">
            <value>clientEncoding=UTF-8</value>
        </property>
    </bean>

這個的話 可以理解為資料來源的介面吧。

<bean id="dataSourceOption" class="com.ea.mic.dao.mapper.MultipleDataSource">
        <property name="defaultTargetDataSource" ref="dataSource"/>
        <property name="targetDataSources">
            <map>
                <entry key="dataSource" value-ref="dataSource"/>
                <entry key="dataSource_uic" value-ref="dataSource_uic"/>
            </map>
        </property>
</bean>
<!-- mybatis檔案配置,掃描所有mapper檔案 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="mapperLocations">
            <array>
                <value>classpath:conf-mybatis/*Mapper.xml</value>
            </array>
        </property>
        <property name="dataSource" ref="dataSourceOption"/>
        <!-- <property name="dataSource" ref="dataSource" /> -->
        <property name="plugins">
            <list>
            <ref bean="pageIntercepter"/>
            </list>
        </property>
    </bean>

其他的配置就是注入sqlSessionFactory工廠,事物控制的注入 跟單資料來源沒有差別

之後我們要實現MultipleDataSource 用來手動控制資料來源的切換


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

/**
    * @author 作者 :劉
    * @version 建立時間:2016年1月13日 下午5:56:09
    * 類說明
    */
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() {
        return dataSourceKey.get();
    }
}

接下來是實現類

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;

import com.ea.mic.dao.UserManagerDAO;
import com.ea.mic.dao.mapper.MultipleDataSource;
import com.ea.mic.dao.mapper.UserManagerMapper;
import com.ea.mic.model.vo.BuyUserInfoSchema;

/**
 * @author 作者 :劉
 * @version 建立時間:2015年11月6日 上午11:08:18 類說明
 */
@Service
public class UserManagerDAOImpl implements UserManagerDAO {

    @Autowired
    private UserManagerMapper UserManagerMapper;
    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public BuyUserInfoSchema findUserInfo(String userId) {
        //初始化ApplicationContext 如果專案配置的是自動掃描所有的Bean,即可不用手動去讀取配置檔案
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml");
        //滿足上述條件的話,直接從這一步開始
        UserManagerMapper = applicationContext.getBean(UserManagerMapper.class);
        MultipleDataSource.setDataSourceKey("dataSource_uic");
        BuyUserInfoSchema buyUserInfoSchema = UserManagerMapper.findUserInfo(userId);
        //切換回專案預設的資料來源
        MultipleDataSource.setDataSourceKey("dataSource");
        return buyUserInfoSchema;
    }

}

因為是手動切換資料來源,在選擇完之後,似乎MultipleDataSource 預設的資料來源並沒有起作用,因為我就在邏輯執行完成之後又手動切換回去。

總結:
**這種方法比較配置簡單易懂,但是在使用的過程中,需要手動切換,比較麻煩。
還有一種使用SpringAOP實現自動選擇資料來源的方法,我會在下一篇文章中詳細說明。**

然後就沒有然後啦啦啦。。。。。。