亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > JSP > 正文

Spring AOP切面解決數(shù)據(jù)庫(kù)讀寫分離實(shí)例詳解

2024-09-05 00:23:05
字體:
供稿:網(wǎng)友

Spring AOP切面解決數(shù)據(jù)庫(kù)讀寫分離實(shí)例詳解

為了減輕數(shù)據(jù)庫(kù)的壓力,一般會(huì)使用數(shù)據(jù)庫(kù)主從(master/slave)的方式,但是這種方式會(huì)給應(yīng)用程序帶來一定的麻煩,比如說,應(yīng)用程序如何做到把數(shù)據(jù)寫到master庫(kù),而讀取數(shù)據(jù)的時(shí)候,從slave庫(kù)讀取。如果應(yīng)用程序判斷失誤,把數(shù)據(jù)寫入到slave庫(kù),會(huì)給系統(tǒng)造成致命的打擊。

解決讀寫分離的方案很多,常用的有SQL解析、動(dòng)態(tài)設(shè)置數(shù)據(jù)源。SQL解析主要是通過分析sql語句是insert/select/update/delete中的哪一種,從而對(duì)應(yīng)選擇主從。而動(dòng)態(tài)設(shè)置數(shù)據(jù)源,則是通過攔截方法名稱的方式來決定主從的,例如:save*(),insert*() 形式的方法使用master庫(kù),select()開頭的,使用slave庫(kù)。蠻多公司會(huì)使用在方法上標(biāo)上自定義的@Master、@Slave之類的標(biāo)簽來選擇主從,也有公司直接就調(diào)用setxxMaster,setxxSlave之類的代碼進(jìn)行主從選擇。

下面我主要介紹一下基于Spring AOP動(dòng)態(tài)設(shè)置數(shù)據(jù)源這種方式。注意這篇文章是基于自己項(xiàng)目的實(shí)際情況的,不是通用的方案,請(qǐng)知曉。

原理圖

Spring,AOP,切面,數(shù)據(jù)庫(kù),讀寫分離,AOP切面
 

Spring AOP的切面主要的職責(zé)是攔截Mybatis的Mapper接口,通過判斷Mapper接口中的方法名稱來決定主從。

 Spring AOP 切面配置

<aop:config expose-proxy="true">  <aop:pointcut id="txPointcut" expression="execution(* com.test..persistence..*.*(..))" />  <aop:aspect ref="readWriteInterceptor" order="1">  <aop:around pointcut-ref="txPointcut" method="readOrWriteDB"/>  </aop:aspect>  </aop:config>     <bean id="readWriteInterceptor" class="com.test.ReadWriteInterceptor">    <property name="readMethodList">     <list>      <value>query*</value>      <value>use*</value>      <value>get*</value>      <value>count*</value>      <value>find*</value>      <value>list*</value>      <value>search*</value>    </list>   </property>  <property name="writeMethodList">    <list>      <value>save*</value>      <value>add*</value>      <value>create*</value>      <value>insert*</value>      <value>update*</value>      <value>merge*</value>      <value>del*</value>      <value>remove*</value>      <value>put*</value>      <value>write*</value>    </list>  </property>  </bean> 

把所有Mybatis接口類都放置在persistence下。配置的切面類是ReadWriteInterceptor。這樣當(dāng)Mapper接口的方法被調(diào)用時(shí),會(huì)先調(diào)用這個(gè)切面類的readOrWriteDB方法。在這里需要注意<aop:aspect>中的order="1" 配置,主要是為了解決切面于切面之間的優(yōu)先級(jí)問題,因?yàn)檎麄€(gè)系統(tǒng)中不太可能只有一個(gè)切面類。

Spring AOP 切面類實(shí)現(xiàn)

public class ReadWriteInterceptor {   private static final String DB_SERVICE = "dbService";   private List<String> readMethodList = new ArrayList<String>();   private List<String> writeMethodList = new ArrayList<String>(); 
  public Object readOrWriteDB(ProceedingJoinPoint pjp) throws Throwable {     String methodName = pjp.getSignature().getName();     if (isChooseReadDB(methodName)) {       //選擇slave數(shù)據(jù)源     } else if (isChooseWriteDB(methodName)) {       //選擇master數(shù)據(jù)源     } else {      //選擇master數(shù)據(jù)源     }     return pjp.proceed(); }   private boolean isChooseWriteDB(String methodName) {    for (String mappedName : this.writeMethodList) {      if (isMatch(methodName, mappedName)) {        return true;      }    }   return false; }   private boolean isChooseReadDB(String methodName) {   for (String mappedName : this.readMethodList) {     if (isMatch(methodName, mappedName)) {       return true;     }   }   return false; }   private boolean isMatch(String methodName, String mappedName) {   return PatternMatchUtils.simpleMatch(mappedName, methodName); }   public List<String> getReadMethodList() {   return readMethodList;  }   public void setReadMethodList(List<String> readMethodList) {   this.readMethodList = readMethodList; }   public List<String> getWriteMethodList() {   return writeMethodList;  }   public void setWriteMethodList(List<String> writeMethodList) {   this.writeMethodList = writeMethodList; }  

覆蓋DynamicDataSource類中的getConnection方法

ReadWriteInterceptor中的readOrWriteDB方法只是決定選擇主還是從,我們還必須覆蓋數(shù)據(jù)源的getConnection方法,以便獲取正確的connection。一般來說,是一主多從,即一個(gè)master庫(kù),多個(gè)slave庫(kù)的,所以還得解決多個(gè)slave庫(kù)之間負(fù)載均衡、故障轉(zhuǎn)移以及失敗重連接等問題。

1、負(fù)載均衡問題,slave不多,系統(tǒng)并發(fā)讀不高的話,直接使用隨機(jī)數(shù)訪問也是可以的。就是根據(jù)slave的臺(tái)數(shù),然后產(chǎn)生隨機(jī)數(shù),隨機(jī)的訪問slave。

2、故障轉(zhuǎn)移,如果發(fā)現(xiàn)connection獲取不到了,則把它從slave列表中移除,等其回復(fù)后,再加入到slave列表中

3、失敗重連,第一次連接失敗后,可以多嘗試幾次,如嘗試10次。

處理業(yè)務(wù)方法中的@Transactional注解

我參與的這個(gè)項(xiàng)目,大部分業(yè)務(wù)代碼是不需要事務(wù)的,只有極個(gè)別情況需要。那么按照上面提到的方案,如果不對(duì)業(yè)務(wù)方法中@Transactional注解進(jìn)行特殊處理的話,主從的選擇會(huì)出現(xiàn)問題。大家都知道,如果使用了Spring的事務(wù),那么在同一個(gè)業(yè)務(wù)方法內(nèi),只會(huì)調(diào)用一次數(shù)據(jù)源的getConnection方法,如果該業(yè)務(wù)方法內(nèi),調(diào)用的mapper接口剛好以select開頭的,就會(huì)選擇slave庫(kù),那么接下來調(diào)用以insert開頭的mapper接口方法時(shí),會(huì)把數(shù)據(jù)寫入到slave庫(kù)。如何解決這個(gè)問題呢?必須在進(jìn)入標(biāo)有@Transactional注解的業(yè)務(wù)方法前,指定選擇master主庫(kù)??梢酝ㄟ^覆蓋DataSourceTransactionManager類中的doBegin方法,如下:

public class MyTransactionManager extendsDataSourceTransactionManager{  @Override  protected void doBegin(Object transaction, TransactionDefinitiondefinition) {  //選擇master數(shù)據(jù)庫(kù)  super.doBegin(transaction, definition);  }  } 

這樣既可以避免,把數(shù)據(jù)寫入到從庫(kù)的問題。

總結(jié)

本人的解決方案是基于項(xiàng)目實(shí)際的,不一定合適你,我只是展示了解決方案而已。當(dāng)然你可以選擇開源的框架,像阿里的Cobar,360的Atlas。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JSP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
日韩免费一级| 欧美私密网站| 欧美福利视频一区二区| 久久亚洲一区二区三区明星换脸| 国产亚洲精品久久久久久移动网络| 国产美女精品人人做人人爽| 99精品国自产在线| 欧美激情喷水| 濑亚美莉vs黑人在线观看| 精品人妻在线视频| av小次郎在线| 日韩手机在线| 国产精品欧美久久| 国产精品一区免费观看| 国产suv一区二区三区88区| 日韩高清中文字幕一区二区| 国产精品久久久久久久久图文区| 日韩av在线免费看| 午夜国产福利| 麻豆视频免费在线观看| 视频一区二区精品| 91porn在线视频| 三上悠亚激情av一区二区三区| 成人羞羞视频在线看网址| 玩弄japan白嫩少妇hd| 中文日韩欧美| 牛牛热在线视频| 亚洲大尺度网站| 福利地址发布页| av美女在线观看| 国产在线播放一区| a屁视频一区二区三区四区| 91在线看国产| 国产呦萝稀缺另类资源| 国产又粗又长又硬| 无码毛片aaa在线| 91视频在线网站| 国模一区二区三区| 亚洲乱码一区二区三区三上悠亚| 亚洲制服国产| 欧美三级电影一区| 影音av资源| 亚洲精品视频三区| 三级黄色录像视频| 性做爰过程免费播放| 中文字幕亚洲在| 成人欧美一区二区三区在线湿哒哒| 国产二区视频| 91一区二区三区在线播放| 国产va在线视频| 91精品综合久久久久久久久久久| 一个色妞综合视频在线观看| 一区二区三区国产精品| 欧美日韩不卡一区| 亚洲黄色性网站| 精品少妇人妻av免费久久洗澡| 日本成人中文字幕| 国产成人综合亚洲网站| 4438欧美| 国产一区二区三区在线视频观看| 在线看片你懂得| 亚洲精品午夜级久久久久| 国产一区二区无遮挡| 欧美色资源站| 国产精品久久二区| 日韩一级毛片| 成人女人免费毛片| 亚洲精品久久| 91成人在线| 国产精品自拍毛片| 精品国产一区二区三区久久久狼| 69堂精品视频| 精品免费视频一区二区| frxxee中国xxx麻豆hd| 满满都是荷尔蒙韩剧在线观看| 日韩欧美二区| 亚洲第一色网| 精品欧美日韩在线| 欧美xxxx黑人| 国产大片一区二区三区| 91高跟黑色丝袜呻吟在线观看| 成人中文字幕av| 91久久国产视频| 国产精品2018| 亚洲大胆人体在线| 久久久久久久久一区二区| 91国内免费在线视频| 国产伦精品一区二区三区免费优势| 91精品久久香蕉国产线看观看| 亚洲啪av永久无码精品放毛片| 手机在线中文字幕| 国产男女无遮挡猛进猛出| 日韩在线第七页| 国产99久久久国产精品成人免费| 免费观看在线黄色网| 欧美成人免费全部观看天天性色| japanese国产在线观看| 欧洲美女少妇精品| 成人性生交免费看| 黄色aaa级片| 国产一级影片| 欧美日韩国产另类不卡| 国产成人综合一区二区三区| 性色av无码久久一区二区三区| 亚洲国产中文字幕在线| 日韩专区av| 日韩美女在线观看一区| videoxxxx另类日本极品| 免费观看的毛片| 久久电影天堂| 希岛爱理一区二区三区av高清| 午夜一区二区三区四区| 日韩字幕在线观看| 99精品全国免费观看| 亚洲成人福利视频| 深夜福利在线看| 国产福利在线播放麻豆| 鲁一鲁一鲁一鲁一澡| 国产中文字幕av| 6080日韩午夜伦伦午夜伦| 亚洲无人区一区| 素人一区二区三区| 久久新电视剧免费观看| china中国猛gary| 国产农村妇女毛片精品久久莱园子| 欧美日韩伦理片| 亚洲美女黄色片| 国产黄色免费网站| 久久精品人人做人人爽电影| 欧美一区二区在线观看视频| 在线观看h视频| 极品一线天粉嫩虎白馒头| 国产精品久久久久秋霞鲁丝| 欧美成人精品欧美一级| 91啦中文在线观看| 中文字幕v亚洲ⅴv天堂| 欧美一区二区在线看| 日本大胆在线观看| 黄网站免费在线播放| 中文字幕制服丝袜一区二区三区| 九九久久久久久| 日韩欧美一二三四区| 国产精品精品软件视频| 影音av资源| 日日骚久久av| 欧美日韩综合视频网址| 狼人精品一区二区三区在线| 向日葵污视频在线观看| 日韩精品一区二区三区视频在线观看| av 日韩 人妻 黑人 综合 无码| 久久久久亚洲av无码专区首jn| 久久精品一区八戒影视| 午夜国产福利在线| 日韩午夜电影在线观看| 日韩欧美激情四射| 黑森林福利视频导航| 国产成人综合精品三级| 在线观看中文字幕视频| 国产高清精品久久久久| 国产日韩欧美精品| 一区二区国产视频| 国产二区三区在线| 亚洲狼人精品一区二区三区| 国产成人福利片| 日本高清成人vr专区| 国产夫妻在线| 欧美亚洲国产一区二区三区va| 国产精品视频中文字幕| 欧美日韩美少妇| 一区二区三区自拍视频| 波多野结衣高清在线| 国产在线视频一区二区三区| 美女性感视频久久| 久久国产精品黑丝| 亚洲国产天堂av| 日日av拍夜夜添久久免费| 亚洲日本在线天堂| 欧美大片日本大片免费观看| xxww在线观看| 久久99精品视频一区97| 欧美色图影院| 校花撩起jk露出白色内裤国产精品| 中文日韩在线观看| 三级外国片在线观看视频| 91污片在线观看| 欧美成人一二区| 亚洲欧洲制服丝袜| 亚洲天天影视网| 夜夜嗨网站十八久久| 在线观看日韩一区二区| 久操视频在线观看| 五月天亚洲精品| 免费看涩涩视频软件| 国精产品一区一区三区四川| 一区二区三区av在线| 日韩精品麻豆| 一本大道东京热无码aⅴ| 色噜噜狠狠狠综合曰曰曰| а√天堂中文在线资源bt在线| 国内精品偷拍| 国产精品精品一区二区三区午夜版| 亚洲一区二区三区黄色| 中文字幕在线直播| 精品人妻无码一区二区性色| 欧美疯狂party性派对| 在线一区二区观看| 亚洲大奶少妇| 一级免费a一片| 国产91在线观看丝袜| 欧美日韩精品久久久免费观看| 亚洲va综合va国产va中文| 成人免费视频一区| 国产精品99久久久久久似苏梦涵| 99热这里只有精品1| 在线观看欧美理论a影院| 日本天堂免费a| 色琪琪一区二区三区亚洲区| 91久久精品www人人做人人爽| 亚洲视频图片小说| 国产乡下妇女做爰毛片| 亚洲福利合集| 国产成人jvid在线播放| 亚洲欧美自拍另类| 91啪九色porn原创视频在线观看| 国产伦久视频在线观看| 欧美91福利在线观看| 一区视频二区视频| 欧美精品99久久久| 在线欧美三级| 国产视频福利| 午夜视频免费在线观看| 欧美日韩高清在线| 九色91porny| 亚洲三级久久久| 亚洲三级电影| 婷婷丁香花五月天| 日韩在线激情| 国产精品视频最多的网站| 成年人视频网站| 国产精品一区二区久久精品| 丁香婷婷在线| 很很鲁在线视频播放影院| 中文字幕资源网| 日本一区二区三区在线视频| 野花视频免费在线观看| 成人做爰69片免费看网站| 久久久久国产精品免费免费搜索| 中文字幕无码不卡免费视频| 精品中文字幕一区二区三区四区| 777永久免费网站国产| 亚洲va欧美va在线观看| 深夜福利一区| yy4480电影网| 国产精品理人伦一区二区三区| 日本不卡视频一区| 国产精品一区二区三区久久| 国产日韩精品电影| 中文字幕一二区| heyzo欧美激情| 日韩av有码| 成片免费观看视频| 国产精品扒开做爽爽爽的视频| 国产精品一区高清| 变态黄色小视频网站| 四虎精品成人a在线观看| 国产午夜精品理论片在线| 久久香蕉精品| 欧美大片在线观看一区二区| 国产精品自拍在线| 国产精品久久色| 最近高清中文在线字幕在线观看| 香港伦理在线| 欧洲美女和动交zoz0z| 麻豆9191精品国产| 狠狠久久亚洲欧美专区| 国产高清免费在线观看| 亚洲成人影院麻豆| 国产成人精品999| 欧美舌奴丨vk视频| 亚洲第一成年网| 国产成人高清| 鲁一鲁一鲁一鲁一澡| 国产免费av国片精品草莓男男| 久久久人人爽| 久久亚洲天堂网| 福利在线国产| 亚洲免费一级电影| 成人国产在线看| 91麻豆福利精品推荐| 91传媒视频在线播放| 亚洲午夜精品一区 二区 三区| 国产精品日韩在线| 中国在线观看免费国语版电影| 日本熟妇一区二区三区| 久久久久久国产精品三级玉女聊斋| 亚州视频一区二区三区| 日本高清一区| 国精产品一区一区三区mba视频| 久久精品网址| 久久日本片精品aaaaa国产| 污视频在线免费观看| 日本国产精品视频| 2020国产在线| 日本a一级在线免费播放| 久久中文字幕人妻| 人妻va精品va欧美va| 色一区二区三区| 免费黄色在线看| 欧美乱强性伦xxxxx| 国产欧美一区二区三区不卡高清| 日韩经典中文字幕一区| 国产伊人久久| 欧美视频综合| 成看片vvv222| 国产精品一二三四五区| 美女又爽又黄免费| 亚洲va欧美va人人爽| 人人精品人人爱| 亚洲精品福利免费在线观看| 国产三级小视频| 国产精品无码无卡无需播放器| 四虎永久在线精品无码视频| 精品国产免费一区二区三区四区| 思思久久99热只有频精品66| 国产av人人夜夜澡人人爽| 一区二区在线视频| 精品久久久久久亚洲精品| 亚洲美女视频在线观看|