日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换

發布時間:2024/4/11 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。

歡迎跳轉到本文的原文鏈接:https://honeypps.com/java/spring-mybatis-multi-datasource-props-4/

有時候需要在程序中動態切換數據源,那么這個系列的之前的博文所闡述的方法就不再使用了,總不能通過程序更改config.properties文件的dataSource的值,然后再重啟web服務器以便加載applicationContext.xml文件。這里講訴的是如何利用AbstractRoutingDataSource進行數據源動態切換。

首先上applicationContext.xml文件:

?

<?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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beansclasspath:/org/springframework/beans/factory/xml/spring-beans-3.0.xsdhttp://www.springframework.org/schema/aop classpath:/org/springframework/aop/config/spring-aop-3.0.xsdhttp://www.springframework.org/schema/contextclasspath:/org/springframework/context/config/spring-context-3.0.xsdhttp://www.springframework.org/schema/tx classpath:/org/springframework/transaction/config/spring-tx-3.0.xsd"><!-- IoC配置 --><!-- 掃描類包,將標注Spring注解的類自動轉化Bean,同時完成Bean的注入 --><context:component-scan base-package="com.shr.dao" /><context:component-scan base-package="com.shr.service" /><!-- DAO配置 --><context:property-placeholder location="classpath:config.properties"/><bean id="mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="${mysql_driver}"/><property name="url" value="${mysql_url}"/><property name="username" value="${mysql_username}"/><property name="password" value="${mysql_password}"/></bean><bean id="oracle" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="${ora_driver}"/><property name="url" value="${ora_url}"/><property name="username" value="${ora_username}"/><property name="password" value="${ora_password}"/></bean><bean id="dataSource" class="com.shr.dao.datasource.DataSources"><property name="targetDataSources"><map key-type="java.lang.String"><entry value-ref="mysql" key="MYSQL"></entry><entry value-ref="oracle" key="ORACLE"></entry></map></property><property name="defaultTargetDataSource" ref="mysql"></property></bean><bean id="vendorProperties"class="org.springframework.beans.factory.config.PropertiesFactoryBean"><property name="properties"><props><prop key="Oracle">oracle</prop><prop key="MySQL">mysql</prop></props></property></bean><bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider"><property name="properties" ref="vendorProperties" /></bean><bean name="myBatisSQLInterceptor" class="com.shr.dao.MyBatisSQLInterceptor"></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="typeAliasesPackage" value="com.shr.dao.pojo,com.shr.dao.model" /><property name="databaseIdProvider" ref="databaseIdProvider" /><property name="mapperLocations"><list><value>classpath:com/shr/dao/resources/mappers/*_mapper.xml</value></list></property><!-- <property name="configLocation" value="/WEB-INF/mybatis-config.xml"/> --><property name="typeHandlersPackage" value="com.shr.dao" /><property name="plugins"><list><ref bean="myBatisSQLInterceptor"/></list></property></bean><!-- 配置事務管理器 --><tx:annotation-driven/><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="${dataSource}"/></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.shr.dao.mapper"/><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!-- <property name="markerInterface" value="com.shr.dao.mapper.ITemplateMapper"/> --></bean> </beans>

我們可以觀察到文件中多了一段:

?

?

<bean id="dataSource" class="com.shr.dao.datasource.DataSources"><property name="targetDataSources"><map key-type="java.lang.String"><entry value-ref="mysql" key="MYSQL"></entry><entry value-ref="oracle" key="ORACLE"></entry></map></property><property name="defaultTargetDataSource" ref="mysql"></property></bean>

而且sqlSessionFactory的dataSource是關聯到上面這段內容的,而不是通過${dataSource}讀取config.properties文件的內容獲取的。

?

這個com.shr.dao.datasource.DataSources是自定義的類,繼承自AbstractRoutingDataSource類,實現其determineCurrentLookupKey()方法。

代碼如下:

?

package com.shr.dao.datasource; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DataSources extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey(){return DataSourceSwitch.getDataSourceType();} } package com.shr.dao.datasource;public class DataSourceSwitch {private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();public static void setDataSourceType(String dataSourceType){contextHolder.set(dataSourceType);}public static String getDataSourceType(){return contextHolder.get();}public static void clearDataSourceType(){contextHolder.remove();} } package com.shr.dao.datasource;public class DataSourceInstances {public static final String MYSQL="MYSQL";public static final String ORACLE="ORACLE"; }

同樣,我們通過一個junit測試用例進行驗證:

?

?

package com.shr.dao.datasource;import java.util.List;import javax.inject.Inject;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionConfiguration; import org.springframework.transaction.annotation.Transactional;import com.shr.dao.datasource.DataSourceInstances; import com.shr.dao.datasource.DataSourceSwitch; import com.shr.dao.model.userManage.UserListInfo; import com.shr.service.userManage.UserManageService;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:WebContent/WEB-INF/applicationContext.xml") @Transactional @TransactionConfiguration(transactionManager="transactionManager",defaultRollback=false) public class DynamicDataSourceTest {@Injectprivate UserManageService userManageService;@Testpublic void test(){DataSourceSwitch.setDataSourceType(DataSourceInstances.MYSQL);List<UserListInfo> list = userManageService.getUserListInfo();for(UserListInfo user : list){System.out.println(user.getUser_name());}} }

通過改變DataSourceSwitch.setDataSourceType(DataSourceInstances.ORACLE);可以轉換不同的數據源.

歡迎跳轉到本文的原文鏈接:https://honeypps.com/java/spring-mybatis-multi-datasource-props-4/

歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。

總結

以上是生活随笔為你收集整理的Spring+Mybatis多数据源配置(四)——AbstractRoutingDataSource实现数据源动态切换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。