欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring配置動態(tài)數(shù)據(jù)源實(shí)現(xiàn)讀寫分離的方法

 更新時間:2017年01月19日 10:52:54   作者:簡單的土豆  
這篇文章主要介紹了利用Spring配置動態(tài)數(shù)據(jù)源實(shí)現(xiàn)讀寫分離的方法,文中通過示例代碼介紹的很詳細(xì),相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,藕需要的朋友可以一起學(xué)習(xí)學(xué)習(xí)。

前言

最近因?yàn)楣ぷ鞯男枰罱ǖ囊粋€項(xiàng)目需要實(shí)現(xiàn)數(shù)據(jù)源的讀寫分離,在這里將代碼進(jìn)行分享,有需要的朋友們可以參考學(xué)習(xí)。

首先是配置數(shù)據(jù)源

<!--讀數(shù)據(jù)源配置-->
<bean id="readDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
//配置省略
</bean>

<!--寫數(shù)據(jù)源配置-->
<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
//配置省略
</bean>

<!-- 動態(tài)數(shù)據(jù)源 -->
<bean id = "dataSource" class="com.potato.common.bean.DynamicDataSource" > 
 <!-- 已配置的數(shù)據(jù)源 --> 
 <property name="targetDataSources">  
 <map>   
  <entry key="READ" value-ref="readDataSource"/>   
  <entry key="WRITE" value-ref="writeDataSource"/>  
 </map> 
 </property> 
 <!-- 默認(rèn)的數(shù)據(jù)源 --> 
 <property name="defaultTargetDataSource" ref="writeDataSource"/>
</bean>

數(shù)據(jù)源是如何切換的呢?通過動態(tài)數(shù)據(jù)源的配置我們知道原來是通過key來進(jìn)行切換,這里要使用到org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,我們可以編寫自己的動態(tài)數(shù)據(jù)源類DynamicDataSource來繼承它。

public class DynamicDataSource extends AbstractRoutingDataSource { 
 @Override 
 protected Object determineCurrentLookupKey() {  
  return DataSourceContextHolder.getType(); 
 }
}

還需要一個存放key的地方DataSourceContextHolder 為保證切換時線程安全我們使用ThreadLocal來保存我們的key。

public class DataSourceContextHolder {
 private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceContextHolder.class);
 public static final String DATA_SOURCE_WRITE = "WRITE";
 public static final String DATA_SOURCE_READ = "READ";
 // 線程本地環(huán)境
 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

 // 設(shè)置數(shù)據(jù)源類型
 public static void setType(String type) {
  if(LOGGER.isDebugEnabled())
   LOGGER.debug("==============切換數(shù)據(jù)源,類型:"+type+"================");
  contextHolder.set(type);
 }
 // 獲取數(shù)據(jù)源類型
 public static String getType() {
  return (contextHolder.get());
 }
 // 清除數(shù)據(jù)源類型
 public static void clearType() {
  contextHolder.remove();
 }
}

好了,我們可以通過操作DataSourceContextHolder來實(shí)現(xiàn)數(shù)據(jù)源動態(tài)的切換了。小伙伴們可能會說了,難道每次調(diào)用方法都要手動選擇要切換的數(shù)據(jù)源類型?當(dāng)然不是啦,Spring AOP登場。

@Component
@Aspect
public class DynamicDataSourceAspect {

 @Pointcut("execution (* com.potato.orm.mapper.*.select*(..)) || execution (* com.potato.orm.mapper.*.count*(..)) ")
 public void readMethodPointcut() {}

 @Pointcut("execution (* com.potato.orm.mapper.*.insert*(..)) || execution (* com.potato.orm.mapper.*.update*(..)) || execution (* com.potato.orm.mapper.*.delete*(..))")
 public void writeMethodPointcut() {}

 @Before("readMethodPointcut()")
 public void switchReadDataSource(){
  //System.out.println("============切換到讀數(shù)據(jù)源===========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_READ);
 }

 @Before("writeMethodPointcut()")
 public void switchWriteDataSource(){
  //System.out.println("=============切換到寫數(shù)據(jù)源==========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_WRITE);
 }

}

總結(jié)

好啦,以上就是這篇文章的全部內(nèi)容了,在訪問Mapper(本項(xiàng)目使用的是MyBatis啦,相當(dāng)于是DAO)中查詢方法時會切換到讀數(shù)據(jù)源,增、刪、改方法會切換到寫數(shù)據(jù)源。希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • java 對稱加密算法實(shí)現(xiàn)詳解

    java 對稱加密算法實(shí)現(xiàn)詳解

    這篇文章主要介紹了java 對稱加密算法實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • spring boot加載freemarker模板路徑的方法

    spring boot加載freemarker模板路徑的方法

    這篇文章主要介紹了spring boot加載freemarker模板路徑的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 解決使用stream將list轉(zhuǎn)map時,key重復(fù)導(dǎo)致報錯的問題

    解決使用stream將list轉(zhuǎn)map時,key重復(fù)導(dǎo)致報錯的問題

    這篇文章主要介紹了解決使用stream將list轉(zhuǎn)map時,key重復(fù)導(dǎo)致報錯的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring @Scheduled的坑及解決

    Spring @Scheduled的坑及解決

    這篇文章主要介紹了Spring @Scheduled的坑及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • log4j控制臺不打印日志故障的詳細(xì)解決方案

    log4j控制臺不打印日志故障的詳細(xì)解決方案

    這篇文章主要給大家介紹了關(guān)于log4j控制臺不打印日志故障的詳細(xì)解決方案,log4j不提供默認(rèn)配置,因?yàn)樵谀承┉h(huán)境中可能禁止輸出到控制臺或文件系統(tǒng),需要的朋友可以參考下
    2023-08-08
  • java equals和=,==的區(qū)別詳細(xì)介紹

    java equals和=,==的區(qū)別詳細(xì)介紹

    這篇文章主要介紹了java equals和=,==的區(qū)別,學(xué)習(xí)Java的朋友對equals 和== 這個概念開始使用的時候會有疑問,很難辨別如何正確使用,這里幫大家詳細(xì)講解該知識點(diǎn),希望大家能掌握,有需要的小伙伴可以參考下
    2016-10-10
  • eclipse/intellij idea 查看java源碼和注釋方法

    eclipse/intellij idea 查看java源碼和注釋方法

    下面小編就為大家?guī)硪黄猠clipse/intellij idea 查看java源碼和注釋方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • IDEA 中創(chuàng)建并部署 JavaWeb 程序的方法步驟(圖文)

    IDEA 中創(chuàng)建并部署 JavaWeb 程序的方法步驟(圖文)

    本文主要介紹了IDEA 中創(chuàng)建并部署 JavaWeb 程序的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 使用Java對Hbase操作總結(jié)及示例代碼

    使用Java對Hbase操作總結(jié)及示例代碼

    這篇文章主要介紹了使用Java對Hbase進(jìn)行操作總結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot整合Redis實(shí)現(xiàn)刷票過濾功能

    SpringBoot整合Redis實(shí)現(xiàn)刷票過濾功能

    隨著互聯(lián)網(wǎng)的不斷發(fā)展,網(wǎng)站或APP的用戶流量增加,也衍生出了一些惡意刷量等問題,給數(shù)據(jù)分析及運(yùn)營帶來極大的困難,所以本文使用SpringBoot和Redis實(shí)現(xiàn)一個刷票過濾功能,需要的可以參考一下
    2023-06-06

最新評論