1. 程式人生 > >spring aop基礎上得分庫分表(1)

spring aop基礎上得分庫分表(1)

1.環境說明:spring,mybtis,mysql;

2.分兩種方式實現自定義切庫

3.第一種方式通過自定義註解得方式實現

基本思路:我們在使用mybatis得時候,一個數據源配套一套mybatis配置。若要連結多個數據源,那麼就需要多套mybatis配置。通過不同的配置操作相應的資料庫。在實際操作中,我們更多就是通過mapper來操作DB。

(1)定義多個數據源,這裡定義兩個資料來源

jdbc.master.driver=com.mysql.jdbc.Driver
jdbc.slave.driver=com.mysql.jdbc.Driver
jdbc.master.url=jdbc:mysql://127.0.0.1:3306/xxx?characterEncoding=utf-8
jdbc.slave.url=jdbc:mysql://127.0.0.1:3306/xxx?characterEncoding=utf-8
jdbc.slave.username=zzz
jdbc.slave.password=zzz
jdbc.master.username=zzz
jdbc.master.password=zzz

(2)生成不同的mapper(例如mybatis外掛生成dao,mapper,xml工具)

(3)配置資料來源

<!-- 資料庫連線池 -->
<bean id="abstractDataSource" abstract="true" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="maxActive" value="30" />
<property name="minIdle" value="10" />
</bean>
<bean id="master" parent="abstractDataSource">
<property name="url" value="${jdbc.master.url}" />
<property name="username" value="${jdbc.master.username}" />
<property name="password" value="${jdbc.master.password}" />
<property name="driverClassName" value="${jdbc.master.driver}" />
</bean>
<bean id="slave" parent="abstractDataSource">
<property name="url" value="${jdbc.slave.url}" />
<property name="username" value="${jdbc.slave.username}" />
<property name="password" value="${jdbc.slave.password}" />
<property name="driverClassName" value="${jdbc.slave.driver}" />
</bean>

       <!-- 配置動態資料來源,這targetDataSource就是路由資料來源所對應的名稱 -->
<bean id="dataSource" class="com.lai.lailaishare.mapper.split.DynamicDataSource">
<property name="targetDataSources">
<map>
<entry value-ref="master" key="master"></entry>
<entry value-ref="slave" key="slave"></entry>
</map>
</property>

</bean>

 mybatis抽象資料來源路由

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource{

	@Override
	protected Object determineCurrentLookupKey() {
		return DynamicDataSourceHolder.getDb();
	}
	
}

(3)在請求的方法上面加註解

@Aspect 
@Component 
@Slf4j 
public class DynamicDataSourceAspect { 
	@Before("@annotation(RoutingDataSource)") 
	public void beforeSwitchDS(JoinPoint point){ 
		//獲得當前訪問的
		class Class<?> className = point.getTarget().getClass(); 
		//獲得訪問的方法名 
		String methodName = point.getSignature().getName(); //得到方法的引數的型別 
		Class[] argClass = ((MethodSignature)point.getSignature()).getParameterTypes(); 
		String dataSource = DataSourceContextHolder.DEFAULT_DATASOURCE; 
		try { 
			// 得到訪問的方法物件 
			Method method = className.getMethod(methodName, argClass); // 判斷是否存在@DS註解 
			if (method.isAnnotationPresent(RoutingDataSource.class)) { 
				RoutingDataSource annotation = method.getAnnotation(RoutingDataSource.class); 
				// 取出註解中的資料來源名 
				dataSource = annotation.value(); 
			}
		} catch (Exception e) {
			log.error("routing datasource exception, " + methodName, e); 
		} 
		// 切換資料來源 
		DataSourceContextHolder.setDB(dataSource); 
	} 
	@After("@annotation(RoutingDataSource)") 
	public void afterSwitchDS(JoinPoint point){ 
		DataSourceContextHolder.clearDB(); 
	} 
}

在這裡使用threadLocal來避免多執行緒之間互相影響。同時也需要注意請求完後清空threadlocal避免記憶體洩露

使用:在service層配置:

        @Override
	@RoutingDataSource(DataSources.SLAVE_DB)
	public ServerResponse<String> updateUser(User user) {
		System.out.println(1);
		ServerResponse<String> checkValid = checkValid(user.getUsername(), Const.USERNAME);
		if(checkValid.isSuccess()) {
			User updateUser = new User();
			updateUser.setId(user.getId());
			updateUser.setPhone(user.getPhone());
			userMapper.updateByPrimaryKeySelective(updateUser);
			return ServerResponse.createBySuccessMessage(null);
		} else {
			return checkValid;
		}
	}

相關推薦

spring aop基礎分庫(1)

1.環境說明:spring,mybtis,mysql;2.分兩種方式實現自定義切庫3.第一種方式通過自定義註解得方式實現基本思路:我們在使用mybatis得時候,一個數據源配套一套mybatis配置。若要連結多個數據源,那麼就需要多套mybatis配置。通過不同的配置操作相應

Sharding-Sphere 3.X 與spring與mybatis整合(分庫)demo

最近在弄這個sharding-sphere,公司內部分庫分表是在此業務程式碼上進行邏輯分庫分表,但是這種總是不好,也調研了幾款分庫分表中介軟體、mycat、網易cetus、阿里DRDS、這幾種就是背景強大,大公司經過大量的實戰,成熟度很高,而框架sharding-sphere

分庫(1) --- 理論

分庫分表---理論 當一張表的資料達到幾千萬時,查詢一次所花的時間會變長。業界公認MySQL單表容量在 1千萬 以下是最佳狀態,因為這時它的BTREE索引樹高在3~5之間。 資料切分可以分為:垂直切分和水平切分。 一、垂直切分 垂直切分又可以分為: 垂直分庫和垂直分表。 1、垂直分庫 概念 就是根據業務耦

Sharding-Sphere 3.X 與spring與mybatis集成(分庫)demo

sharding jdbc 分庫分表最近在弄這個sharding-sphere,公司內部分庫分表是在此業務代碼上進行邏輯分庫分表,但是這種總是不好,也調研了幾款分庫分表中間件、mycat、網易cetus、阿裏DRDS、這幾種就是背景強大,大公司經過大量的實戰,成熟度很高,而框架sharding-sphere比

分庫設計基礎

很多 有關 生成 select xxxx 維度 主備 出現 例如 隨著當今系統中的數據量越來越龐大,當我們設計系統時經常會關心數據庫的性能,以及數據庫是否需要做分庫分表處理。數據庫是否要分庫分表需要由業務吞吐量、數據庫品牌、數據量等多方面決定,分庫分表也還分為水平切分和垂直

【幹貨】數據庫分庫基礎和實踐

ima 邏輯關系 部分 平分 range cto database 單個 ron 數據庫架構的演變在業務數據量比較少的時代,我們使用單機數據庫就能滿足業務使用,隨著業務請求量越來越多,數據庫中的數據量快速增加,這時單機數據庫已經不能滿足業務的性能要求,數據庫主從復制架構隨之

MySql(二十六)--分庫--基礎

  實在沒招的時候,才考慮分庫分表。 一個經驗值,mysql一張表的記錄不要超過500萬條。 https://www.cnblogs.com/sunny3096/p/8595058.html https://blog.csdn.net/hello12345

Netty遊戲伺服器實戰開發(11):Spring+mybatis 手寫分庫策略(續)

在大型網路遊戲中,傳統的遊戲伺服器無法滿足效能上的需求。所以有了分散式和微服務新起,在傳統web伺服器中,我們儲存使用者等資訊基本都是利用一張單表搞定,但是在遊戲伺服器中,由於要求比較高,我們不能存在大表操作,即分庫分表策略。在以前的文章中有關介紹分庫分表的,下面我們來實戰一下,首先我們

分庫】sharding-jdbc + spring boot對大進行分庫

一、前言       最近小編跳槽了,剛好入職了一家移動網際網路公司。非常的幸運。來新公司後的第一個專案就是對通知服務進行優化改進,其中,一個業務就是當用戶登入的時候,就會登入訪問通知表,根據使用者id載入通知資訊。由於通知量已經上億了,在查詢的時候是非常慢的。

在ASP.NET Core 2.0操作MongoDB就是能這麼的簡便酷爽(自動完成分庫

NoSQL是泛指非關係型的資料庫,現今在我們的專案中也多有使用,其獨特的優點為我們的專案架構帶來了不少亮點,而我們這裡的主角(MongoDB)則是NoSQL資料庫家族中的一種。事實上,NoSQL資料庫的應用場景有很多,其最主要的目的就是為了能解決大規模資料集合多重資料種類帶來的困難,及大資料應用的難題。

Spring Boot 結合 Sharding-Jdbc做分庫示例

對於一些大系統,資料庫資料量很大,業務量特別大的時候,而我們的資料庫及表的對於大資料量的時候,處理的效能就不容樂觀,這個時候我們就需要對我們的資料和表做分庫分表處理了。一般分庫分表都會採用資料庫中介軟體,像Mycat這種中介軟體,它幫我們做資料來源,路由對映控制。而今天介紹的Sharding

Spring Boot入門教程(四十四): Sharding-JDBC+JPA|MyBatis+Druid分庫實現

一:資料庫分片方案 客戶端代理: 分片邏輯在應用端,封裝在jar包中,通過修改或者封裝JDBC層來實現。 噹噹網的 Sharding-JDBC 、阿里的TDDL是兩種比較常用的實現。 中介軟體代理: 在應用和資料中間加了一個代理層。分片邏輯統一維護在中介軟體

乾貨:資料庫分庫基礎和實踐

資料庫架構的演變 在業務資料量比較少的時代,我們使用單機資料庫就能滿足業務使用,隨著業務請求量越來越多,資料庫中的資料量快速增加,這時單機資料庫已經不能滿足業務的效能要求,資料庫主從複製架構隨之應運而生。 主從複製是將資料庫寫操作和讀操作進行分離,使用多個只讀例項(s

Spring+mybatis分庫

分庫分表一直是潮流,我這邊簡單介紹一下我實現分庫、主從分離的一些實踐經驗。 1、實現分庫: 首先在配置檔案中配置多個數據源 其次自定義資料來源定向類繼承spring提供的AbstractRoutingDataSource,複寫determineCurrentLookupK

spring+hibernate實現分庫操作

分庫的實現: 寫一個動態的資料來源類 public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey

Spring MVC +Spring + Mybatis 構建分庫總結 SSM搭建以及分庫的實現

分庫分表在小型公司很少能遇到也很少使用,畢竟資料量沒有那麼大,當資料量大,所有資料都壓在一張表時,如果單從資料庫的角度考慮是可以分庫分表處理來儲存資料。分庫分表 顧名思義就是根據查詢條件動態的去獲取資料所在的庫和表的位置.例如一個系統有唯一的標識userNum,所有路由規

布式事務、多數據源、分庫中間件之spring boot基於Atomikos+XADataSource布式事務配置(100%純動態)

ads list() row safe ilo list odin context factor 本文描述spring boot基於Atomikos+DruidXADataSource分布式事務配置(100%純動態),也就是增加、減少數據源只需要修改application.

基於Dapper的開源Lambda擴充套件,且支援分庫自動生成實體之基礎介紹

LnskyDB LnskyDB是基於Dapper的Lambda擴充套件,支援按時間分庫分表,也可以自定義分庫分表方法.而且可以T4生成實體類免去手寫實體類的煩惱. 文件地址: https://liningit.github.io/LnskyDB/ 開源地址: https://github.com/li

企業專案實戰 .Net Core + Vue/Angular 分庫日誌系統六 | 最終篇-通過AOP自動連線資料庫-完成日誌業務

# 教程預覽 [01 | 前言](https://www.cnblogs.com/HDONG/p/13517146.html) [02 | 簡單的分庫分表設計](https://www.cnblogs.com/HDONG/p/13517207.html) [03 | 控制反轉搭配簡單業務](https:

MySQL分庫備份腳本

數據庫備份數據庫腳本[[email protected]/* */ script]# cat store_backup.sh #!/bin/shMYUSER=rootMYPASS=qwe123SOCKET=/data/3306/mysql.sockMYLOGIN="mysql -u$MYUSER