一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring配置動態數據源實現讀寫分離的方法

Spring配置動態數據源實現讀寫分離的方法

2020-07-29 14:22簡單的土豆 Java教程

這篇文章主要介紹了利用Spring配置動態數據源實現讀寫分離的方法,文中通過示例代碼介紹的很詳細,相信對大家的理解和學習具有一定的參考借鑒價值,藕需要的朋友可以一起學習學習。

前言

最近因為工作的需要,要搭建的一個項目需要實現數據源的讀寫分離,在這里將代碼進行分享,有需要的朋友們可以參考學習。

首先是配置數據源

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--讀數據源配置-->
<bean id="readDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
//配置省略
</bean>
 
<!--寫數據源配置-->
<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
//配置省略
</bean>
 
<!-- 動態數據源 -->
<bean id = "dataSource" class="com.potato.common.bean.DynamicDataSource" >
 <!-- 已配置的數據源 -->
 <property name="targetDataSources"
 <map>  
  <entry key="READ" value-ref="readDataSource"/>  
  <entry key="WRITE" value-ref="writeDataSource"/> 
 </map>
 </property>
 <!-- 默認的數據源 -->
 <property name="defaultTargetDataSource" ref="writeDataSource"/>
</bean>

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

?
1
2
3
4
5
6
public class DynamicDataSource extends AbstractRoutingDataSource {
 @Override
 protected Object determineCurrentLookupKey() { 
  return DataSourceContextHolder.getType();
 }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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";
 // 線程本地環境
 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
 
 // 設置數據源類型
 public static void setType(String type) {
  if(LOGGER.isDebugEnabled())
   LOGGER.debug("==============切換數據源,類型:"+type+"================");
  contextHolder.set(type);
 }
 // 獲取數據源類型
 public static String getType() {
  return (contextHolder.get());
 }
 // 清除數據源類型
 public static void clearType() {
  contextHolder.remove();
 }
}

好了,我們可以通過操作DataSourceContextHolder來實現數據源動態的切換了。小伙伴們可能會說了,難道每次調用方法都要手動選擇要切換的數據源類型?當然不是啦,Spring AOP登場。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@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("============切換到讀數據源===========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_READ);
 }
 
 @Before("writeMethodPointcut()")
 public void switchWriteDataSource(){
  //System.out.println("=============切換到寫數據源==========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_WRITE);
 }
 
}

總結

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

原文鏈接:http://www.jianshu.com/p/077395e7e66f

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩视频第二页 | 含羞草传媒网站免费进入欢迎 | 亚洲精品老司机福利在线播放 | 趴好撅高打屁股sp调教h | 欧美春宫 | 波多野结衣不卡 | 亚洲成色www久久网站 | 亚洲国产欧美在线人成 | 国产精品视频第一区二区 | 放荡的女老板bd中文字幕 | 欧美同志video 在线观看 | 日本bbwbbw| 太大了轻点阿受不了小说h 四色6677最新永久网站 | 国产精品全国探花在线观看 | asianfemdom冷柔女王| 高h肉厨房| 美女扒开腿让男生捅 | uoco福利姬网站 | 日韩在线a视频免费播放 | 日本最大的黄色网站 | 日本视频在线观看播放 | 99精品热视频 | 国产在线观看色 | 亚洲 制服 欧美 中文字幕 | 熟睡中的麻麻大白屁股小说 | futa百合文| 国产偷啪视频一区 | 韩国理论三级在线观看视频 | 99久久免费视频 | 国内交换一区二区三区 | 韩日视频在线 | 99视频网址 | 我与恶魔的h生活ova | 91久久青青青国产免费 | 亚洲国产视频一区 | 好紧好爽再叫浪一点点潘金莲 | 精品欧美小视频在线观看 | 青青青国产手机在线播放 | 国产123区在线视频观看 | chinese国产打屁股 | 东北恋哥在线播放免费播放 |