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

首頁 > 編程 > JSP > 正文

Spring AOP切面解決數據庫讀寫分離實例詳解

2024-09-05 00:18:53
字體:
來源:轉載
供稿:網友

在Internet體系結構的演進中,數據庫往往是一個瓶頸,其優化是不可或缺的一部分,下面我們一起來了解Spring AOP切面解決數據庫讀寫分離實例詳解的相關資料介紹吧,錯新技術頻道小編帶你細細品味吧!

Spring AOP切面解決數據庫讀寫分離實例詳解

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

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

下面我主要介紹一下基于Spring AOP動態設置數據源這種方式。注意這篇文章是基于自己項目的實際情況的,不是通用的方案,請知曉。

原理圖


?

Spring AOP的切面主要的職責是攔截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。這樣當Mapper接口的方法被調用時,會先調用這個切面類的readOrWriteDB方法。在這里需要注意<aop:aspect>中的order="1" 配置,主要是為了解決切面于切面之間的優先級問題,因為整個系統中不太可能只有一個切面類。

Spring AOP 切面類實現

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數據源     } else if (isChooseWriteDB(methodName)) {       //選擇master數據源     } else {      //選擇master數據源     }     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方法只是決定選擇主還是從,我們還必須覆蓋數據源的getConnection方法,以便獲取正確的connection。一般來說,是一主多從,即一個master庫,多個slave庫的,所以還得解決多個slave庫之間負載均衡、故障轉移以及失敗重連接等問題。

1、負載均衡問題,slave不多,系統并發讀不高的話,直接使用隨機數訪問也是可以的。就是根據slave的臺數,然后產生隨機數,隨機的訪問slave。

2、故障轉移,如果發現connection獲取不到了,則把它從slave列表中移除,等其回復后,再加入到slave列表中

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

處理業務方法中的@Transactional注解

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

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

這樣既可以避免,把數據寫入到從庫的問題。

總結

下面是錯新技術頻道小編為大家帶來的Spring AOP切面解決數據庫讀寫分離實例詳解,其實我們的解決方案是基于實際的項目,不一定適合所有的人,而小編只是展示解決方案。

?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频最多的网站| 国产噜噜噜噜噜久久久久久久久| 亚洲第一黄色网| 久久不射热爱视频精品| 日韩精品视频免费在线观看| 久久国产精品久久久久| 欧美午夜性色大片在线观看| 亚洲精品99久久久久中文字幕| 欧美国产精品va在线观看| 国产精品免费一区二区三区都可以| 午夜精品久久久99热福利| 亚洲综合av影视| 久久久久久伊人| 久久亚洲精品中文字幕冲田杏梨| 久久久精品在线| 欧美激情一二区| 国产精品一区二区3区| 亲爱的老师9免费观看全集电视剧| 日韩av一区在线观看| 欧美日韩午夜剧场| 亚洲一级免费视频| 亚洲欧美另类自拍| 国产精品美女久久久久av超清| 色无极影院亚洲| 亚洲一区二区三区777| 亚洲人永久免费| 欧美性xxxxx极品| 国产一区二区三区毛片| 亚洲国产毛片完整版| 国产精品激情av电影在线观看| 亚洲精品99久久久久| 久久久免费观看视频| 亚洲精品456在线播放狼人| 国产精品视频不卡| 91系列在线观看| 久久久久女教师免费一区| 91国产精品电影| 久久影院免费观看| 亚洲一区二区福利| 精品国产一区二区三区久久久| 午夜免费日韩视频| 精品偷拍一区二区三区在线看| 亚洲色无码播放| 日韩av综合中文字幕| 亚洲成人999| 国产精品欧美亚洲777777| 日韩美女写真福利在线观看| 欧美精品成人91久久久久久久| 亚洲欧美制服中文字幕| 亚洲电影av在线| 成人羞羞国产免费| 日韩亚洲综合在线| 91国偷自产一区二区三区的观看方式| 国产91精品视频在线观看| 91精品国产91久久久久久不卡| 亚洲精品视频在线观看视频| 日韩风俗一区 二区| 亚洲的天堂在线中文字幕| 国产精品日韩电影| 亚洲精品美女久久久久| 色综合久久中文字幕综合网小说| 成人精品视频在线| 91在线中文字幕| 欧美激情亚洲一区| 欧美第一页在线| 精品在线欧美视频| 亚洲欧美在线磁力| 亚洲欧美中文另类| 九九热r在线视频精品| 日韩精品视频免费专区在线播放| 欧美久久久精品| 欧美激情视频网站| 久久久久久久久中文字幕| 国产一区二区日韩精品欧美精品| 日韩欧美黄色动漫| 啊v视频在线一区二区三区| 欧美在线一级va免费观看| 久久免费在线观看| 亚洲一区av在线播放| 欧美国产亚洲精品久久久8v| 国产99视频精品免视看7| 欧美午夜精品久久久久久人妖| 日韩精品在线播放| 欧美性猛交视频| 国产精品影院在线观看| 亚洲国产成人在线视频| 神马国产精品影院av| 亚洲国产精品国自产拍av秋霞| 91爱爱小视频k| 中文字幕在线看视频国产欧美在线看完整| 日韩av电影免费观看高清| 亚洲一区二区免费| 国外色69视频在线观看| 中文国产成人精品久久一| 国产精品久久久久久久久影视| 日韩在线观看免费网站| 久久免费视频在线观看| 欧美成人激情视频| 精品国产乱码久久久久酒店| 一本大道亚洲视频| 中文字幕无线精品亚洲乱码一区| 色黄久久久久久| 欧美韩日一区二区| 欧美激情a在线| 亚洲欧美国产精品va在线观看| 亚洲国产精久久久久久久| 日韩精品在线私人| 欧美中文字幕在线观看| 国产精品欧美一区二区三区奶水| 日韩av在线网站| 久久av在线看| 国产一区二区免费| 91麻豆桃色免费看| 一区二区三区回区在观看免费视频| 国产成人精品国内自产拍免费看| 日韩欧美亚洲国产一区| 国产日韩欧美在线播放| 亚洲电影免费观看高清完整版在线观看| 日韩免费精品视频| 69视频在线播放| 欧美一区二区大胆人体摄影专业网站| 55夜色66夜色国产精品视频| 久久久av亚洲男天堂| 欧美俄罗斯性视频| 国产成人精品免费视频| 欧美黄色三级网站| 最近2019年好看中文字幕视频| 色噜噜国产精品视频一区二区| 91中文精品字幕在线视频| 亚洲精品99久久久久中文字幕| 久久久久久久久久久人体| 日韩亚洲一区二区| 国产成人久久久精品一区| 日韩欧美亚洲国产一区| 免费91在线视频| 2019av中文字幕| 欧美国产日韩视频| 国产激情综合五月久久| 欧美黄色免费网站| 在线不卡国产精品| 中文字幕免费国产精品| 成人国产精品免费视频| 日韩视频精品在线| 亚洲国产日韩欧美在线动漫| 欧美一级淫片播放口| 国产成人亚洲综合| 高跟丝袜一区二区三区| 曰本色欧美视频在线| 久久成人免费视频| 亚洲爱爱爱爱爱| 国产欧美中文字幕| 国产剧情久久久久久| www.欧美视频| 亚洲网站视频福利| 97视频在线观看免费高清完整版在线观看| 国产精品毛片a∨一区二区三区|国| 久久av在线看| 国产精品18久久久久久麻辣| 精品久久久久久中文字幕大豆网| 亚洲自拍另类欧美丝袜| 亚洲精品美女视频| 亚洲国产成人精品电影| 国产欧美日韩专区发布| 亚洲女人天堂视频|