您好,登錄后才能下訂單哦!
這篇文章給大家介紹baomidou中怎么利用dynamic-datasource實現(xiàn)讀寫分離,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>2.5.7</version> </dependency>
場景:
在純的讀寫分離環(huán)境,寫操作全部是master,讀操作全部是slave。
不想通過注解配置完成以上功能。
答:在mybatis環(huán)境下可以基于mybatis插件結(jié)合本數(shù)據(jù)源完成以上功能。 手動注入插件。
@Bean public MasterSlaveAutoRoutingPlugin masterSlaveAutoRoutingPlugin(){ return new MasterSlaveAutoRoutingPlugin(); }
默認(rèn)主庫名稱master,從庫名稱slave。
我在配置好了之后,調(diào)試發(fā)現(xiàn)對數(shù)據(jù)庫讀的操作不得進入MasterSlaveAutoRoutingPlugin,而且進入了默認(rèn)的庫。只有寫進入了MasterSlaveAutoRoutingPlugin中。當(dāng)然也可以默認(rèn)為從庫,但是感覺就不是很好。
于是我自定義了一個aop切面來,來完成庫的選擇,代碼如下:
import java.lang.reflect.Method; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; 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.context.annotation.Lazy; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import lombok.extern.java.Log; /** * Copyright: Copyright (c) 2019 * <p> 說明:動態(tài)數(shù)據(jù)源配置 </P> * * @version: V1.0 * @author: BianPeng * */ @Aspect @Component @Order(0) @Lazy(false) @Log public class DataSourceAop{ private static final String MASTER = "master"; private static final String SLAVE = "slave"; @Pointcut("execution(* com.buybit.power.service..*.*(..)) || execution(* com.baomidou.mybatisplus.extension.service..*.*(..))") public void checkArgs() { } // 這里切到你的方法目錄 @Before("checkArgs()") public void process(JoinPoint joinPoint) throws NoSuchMethodException, SecurityException { String methodName = joinPoint.getSignature().getName(); if (methodName.startsWith("get") || methodName.startsWith("count") || methodName.startsWith("find") || methodName.startsWith("list") || methodName.startsWith("select") || methodName.startsWith("check") || methodName.startsWith("page")) { log.info("當(dāng)前執(zhí)行的庫:"+SLAVE); DynamicDataSourceContextHolder.push(SLAVE); } else { log.info("當(dāng)前執(zhí)行的庫:"+MASTER); DynamicDataSourceContextHolder.push(MASTER); } } @After("checkArgs()") public void afterAdvice(){ DynamicDataSourceContextHolder.clear(); } }
但是發(fā)現(xiàn),baomidou/dynamic-datasource自帶的@DS沒失去了著用,于是我把有@DS的類和方法排除掉,代碼入下:
import java.lang.reflect.Method; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; 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.context.annotation.Lazy; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import lombok.extern.java.Log; /** * Copyright: Copyright (c) 2019 * <p> 說明:動態(tài)數(shù)據(jù)源配置 </P> * * @version: V1.0 * @author: BianPeng * */ @Aspect @Component @Order(0) @Lazy(false) @Log public class DataSourceAop{ private static final String MASTER = "master"; private static final String SLAVE = "slave"; @Pointcut("execution(* com.buybit.power.service..*.*(..)) || execution(* com.baomidou.mybatisplus.extension.service..*.*(..))") public void checkArgs() { } // 這里切到你的方法目錄 @Before("checkArgs()") public void process(JoinPoint joinPoint) throws NoSuchMethodException, SecurityException { String methodName = joinPoint.getSignature().getName(); Class clazz = joinPoint.getTarget().getClass(); if(clazz.isAnnotationPresent(DS.class)){ //獲取類上注解 return; } String targetName = clazz.getSimpleName(); Class[] parameterTypes = ((MethodSignature)joinPoint.getSignature()).getMethod().getParameterTypes(); Method methdo = clazz.getMethod(methodName,parameterTypes); if (methdo.isAnnotationPresent(DS.class)) { return; } if (methodName.startsWith("get") || methodName.startsWith("count") || methodName.startsWith("find") || methodName.startsWith("list") || methodName.startsWith("select") || methodName.startsWith("check") || methodName.startsWith("page")) { log.info("當(dāng)前執(zhí)行的庫:"+SLAVE); DynamicDataSourceContextHolder.push(SLAVE); } else { log.info("當(dāng)前執(zhí)行的庫:"+MASTER); DynamicDataSourceContextHolder.push(MASTER); } } @After("checkArgs()") public void afterAdvice(){ DynamicDataSourceContextHolder.clear(); } }
關(guān)于baomidou中怎么利用dynamic-datasource實現(xiàn)讀寫分離就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。