基於mysq資料庫和SqlServer資料共用的記錄
阿新 • • 發佈:2018-12-10
給了個需求,以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> <propertyname="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資料庫要去用其他功能之前要記得把資料來源給切換回去,希望可以幫到部分小夥伴