1. 程式人生 > >基於mysq資料庫和SqlServer資料共用的記錄

基於mysq資料庫和SqlServer資料共用的記錄

給了個需求,以mysql為主資料庫然後一個選單從SqlServer資料庫取資料,開始用jdbc做了下,甚是麻煩了點,就改用框架,廢話不多說,直接上程式碼:

專案框架是ssm的:

spring-mybatis.xml檔案:

mysql的連線配置就直接寫死了,mysql的配置就不多寫了,直接用properties檔案,

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       
xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> <bean id="mySqlDataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close"> <property name="username" value="${connection.username}"></property> <property name="password" value="${connection.password}"></property> <property name="url" value="${connection.url}"></property> <property
name="driverClassName" value="${connection.driverClassName}"></property> <property name="maxActive" value="${connection.maxActive}"></property> <property name="minIdle" value="${connection.minIdle}"></property> <property name="filters" value="${connection.filters}"/> <property name="initialSize" value="${connection.initialSize}"/> <property name="timeBetweenEvictionRunsMillis" value="${connection.timeBetweenEvictionRunsMillis}"/> <property name="minEvictableIdleTimeMillis" value="${connection.minEvictableIdleTimeMillis}"/> <property name="maxOpenPreparedStatements" value="${connection.maxOpenPreparedStatements}"/> <property name="removeAbandoned" value="${connection.removeAbandoned}"/> <property name="removeAbandonedTimeout" value="${connection.removeAbandonedTimeout}"/> <property name="logAbandoned" value="${connection.logAbandoned}"/> </bean> <!-- 配置sqlserver資料來源 --> <bean id="sqlServerDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <property name="url" value="jdbc:sqlserver://XXX.168.x.xxx:1433;DatabaseName=資料庫名稱"/> <property name="username" value="使用者名稱"/> <property name="password" value="密碼"/> </bean> <!-- aop攔截處理,去掉也能執行對應的 dataSource 改掉--> <bean id="dataSource" class="qgs.serviceOperation.util.DbcontextHolder"><!-- 這裡寫選擇資料來源的類地址 下面跟著給出--> <property name="defaultTargetDataSource" ref="mySqlDataSource"/><!-- 設定預設為此mySqlDataSource資料來源--> <property name="targetDataSources"> <map> <entry key="mySqlDataSource" value-ref="mySqlDataSource"/> <entry key="sqlServerDataSource" value-ref="sqlServerDataSource"/> </map> </property> </bean> <!-- myBatis檔案 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath*:/mapper/**/*.xml"/> <property name="configLocation"> <value>classpath:spring/mybatis-setting.xml</value> </property> </bean> <!-- mybatis.spring自動對映 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="qgs.serviceOperation.**.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 註解方式配置事物 --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>


建立一個切換資料來源的工具類 DbcontextHolder:

package qgs.serviceOperation.util;

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

public class DbcontextHolder extends AbstractRoutingDataSource {
    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;
    }
    /**
     *清除上下文
     *
     */
    public void clearContext(){
        contextHolder.remove();
    }
    @Override
    protected Object determineCurrentLookupKey() {
        return DbcontextHolder.getDbType();
    }
}

接下來就是使用了,我是直接在Service的實現類裡呼叫

首先剛開始是mysql資料庫,然後呼叫這個方法的時候就切換下資料來源,

@Override
public List<ProjectFollowInfo> getProjectFollowInfo(Integer id) {
    //切換資料來源
    DbcontextHolder.setDbType("sqlServerDataSource");
    return customerInfoMapper.getProjectFollowInfo(id);
}
當然,用完SqlServer資料庫要去用其他功能之前要記得把資料來源給切換回去,希望可以幫到部分小夥伴