真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用springaop實(shí)現(xiàn)業(yè)務(wù)層mysql讀寫分離

本篇內(nèi)容主要講解“如何使用spring aop實(shí)現(xiàn)業(yè)務(wù)層MySQL讀寫分離”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何使用spring aop實(shí)現(xiàn)業(yè)務(wù)層mysql讀寫分離”吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了南鄭免費(fèi)建站歡迎大家使用!

1.使用spring aop 攔截機(jī)制現(xiàn)數(shù)據(jù)源的動(dòng)態(tài)選取。

import java.lang.annotation.ElementType;
    import java.lang.annotation.Target;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    /
     * RUNTIME
     * 編譯器將把注釋記錄在類文件中,在運(yùn)行時(shí) VM 將保留注釋,因此可以反射性地讀取。
     * @author yangGuang
     *
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface DataSource {
        String value();
    }


 
 3.利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問(wèn)題 參考: http://blog.csdn.net/alaahong/article/details/8707915

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
   
    public class ChooseDataSource extends AbstractRoutingDataSource {

        @Override
        protected Object determineCurrentLookupKey() {
            return HandleDataSource.getDataSource();
        }
        
    }



    4.利用ThreadLocal解決線程安全問(wèn)題

public class HandleDataSource {
        public static final ThreadLocal holder = new ThreadLocal();
        public static void putDataSource(String datasource) {
            holder.set(datasource);
        }
        
        public static String getDataSource() {
            return holder.get();
        }    
    }


    5.定義一個(gè)數(shù)據(jù)源切面類,通過(guò)aop訪問(wèn),在spring配置文件中配置了,所以沒(méi)有使用aop注解。

import java.lang.reflect.Method;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.stereotype.Component;
    //@Aspect
    //@Component
    public class DataSourceAspect {
        //@Pointcut("execution(* com.apc.cms.service.*.*(..))")  
        public void pointCut(){};  
        
      //  @Before(value = "pointCut()")
         public void before(JoinPoint point)
            {
                Object target = point.getTarget();
                System.out.println(target.toString());
                String method = point.getSignature().getName();
                System.out.println(method);
                Class[] classz = target.getClass().getInterfaces();
                Class[] parameterTypes = ((MethodSignature) point.getSignature())
                        .getMethod().getParameterTypes();
                try {
                    Method m = classz[0].getMethod(method, parameterTypes);
                    System.out.println(m.getName());
                    if (m != null && m.isAnnotationPresent(DataSource.class)) {
                        DataSource data = m.getAnnotation(DataSource.class);
                        HandleDataSource.putDataSource(data.value());
                    }
                    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    }

    
    6.配置applicationContext.xml


     
        
        
        
        
        
        
        
        
        
        
        
        
    
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
    
    
    
    
        
    


    
    

    
    
    
       
     
    
    

    
    


    
    
        
        
    

    
    
        
        
    
    
    
          
                
                  
                   
                 
                   
                
              
          
          
    
      
    
    
    
    
    
    
        
            
            
        
    
    



    
7.使用注解,動(dòng)態(tài)選擇數(shù)據(jù)源,分別走讀庫(kù)和寫庫(kù)。

@DataSource("write")
    public void update(User user) {
        userMapper.update(user);
    }
    
    @DataSource("read")
    public Document getDocById(long id) {
        return documentMapper.getById(id);
    }

測(cè)試寫操作:可以通過(guò)應(yīng)用修改數(shù)據(jù),修改主庫(kù)數(shù)據(jù),發(fā)現(xiàn)從庫(kù)的數(shù)據(jù)被同步更新了,所以定義的write操作都是走的寫庫(kù)

 測(cè)試讀操作:  后臺(tái)修改從庫(kù)數(shù)據(jù),查看主庫(kù)的數(shù)據(jù)沒(méi)有被修改,在應(yīng)用頁(yè)面中刷新,發(fā)現(xiàn)讀的是從庫(kù)的數(shù)據(jù),說(shuō)明讀寫分離ok。

 
遇到的問(wèn)題總結(jié):

  問(wèn)題1:項(xiàng)目是maven工程,用到了Spring aop機(jī)制,除了spring的核心jar包以為,還需要用到的jar包有aspectj.jar,aspectjweaver.jar,aopalliance.jar查看項(xiàng)目中的pom,發(fā)現(xiàn)缺少依賴包,
    由于本地倉(cāng)庫(kù)沒(méi)有這些jar,查找可以提供下載jar包的maven中央庫(kù)庫(kù),配置到maven中,自動(dòng)更新:


                    nexus
                    nexus
                    http://repository.sonatype.org/content/groups/public/
                    default
                


    配置項(xiàng)目依賴的jar,主要是缺少這兩個(gè)。


                aspectj
                aspectjrt
                1.5.4
         
         
                aspectj
                aspectjweaver
                1.5.4
        

到此,相信大家對(duì)“如何使用spring aop實(shí)現(xiàn)業(yè)務(wù)層mysql讀寫分離”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


網(wǎng)站題目:如何使用springaop實(shí)現(xiàn)業(yè)務(wù)層mysql讀寫分離
鏈接分享:http://weahome.cn/article/giijch.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部