Java程式設計師乾貨學習筆記—Spring結合MyBatis實現資料庫讀寫分離
隨著系統使用者訪問量的不斷增加,資料庫的頻繁訪問將成為我們系統的一大瓶頸之一。由於專案前期使用者量不大,我們實現單一的資料庫就能完成。但是後期單一的資料庫根本無法支撐龐大的專案去訪問資料庫,那麼如何解決這個問題呢?
實際的應用中,資料庫都是讀多寫少(讀取資料的頻率高,更新資料的頻率相對較少),而讀取資料通常耗時比較長,佔用資料庫伺服器的CPU較多,從而影響使用者體驗。我們通常的做法就是把查詢從主庫中抽取出來,採用多個從庫,使用負載均衡,減輕每個從庫的查詢壓力。
採用讀寫分離技術的目標:有效減輕Master庫的壓力,又可以把使用者查詢資料的請求分發到不同的Slave庫,從而保證系統的健壯性。我們看下采用讀寫分離的背景。
我們在專案開發初期的時候就設計了一個簡單的讀寫分離,現在我把demo分享給大家。
採用技術Spring + mybatis
首先定義一個annotation
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSource {
public String value();
}
再定義一個HandleDataSource
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();
}
}
定義一個切面
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
public class DataSourceAspect {
public void pointCut() {
};
public void before(JoinPoint point) {
Object target = point.getTarget();// 攔截的實體類
String method = point.getSignature().getName();// 攔截的方法名稱
Class[] classz = target.getClass().getInterfaces();
Class[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes();// 攔截的方法引數型別
try {
Method m = classz[0].getMethod(method, parameterTypes);
if (m != null && m.isAnnotationPresent(DataSource.class)) {
DataSource data = m.getAnnotation(DataSource.class);
HandleDataSource.putDataSource(data.value());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
獲取資料來源
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class ChooseDataSource extends AbstractRoutingDataSource {
protected Object determineCurrentLookupKey() {
return HandleDataSource.getDataSource();
}
}
配置XMl
classpath*:mysql.propertiescom.mysql.jdbc.Driver${jdbc.url}${jdbc.user}${jdbc.password}SELECT 1 FROM DUAL32510010000true60com.mysql.jdbc.Driver${jdbc.url.read}${jdbc.user.read}${jdbc.password.read}SELECT 1 FROM DUAL32510010000true60
註解到service介面上面
資料庫表就一張 根據mybatis的xml大家自己建一下
另外這裡還有一個瑕疵就是,當你使用註解事務的時候系統只能讀取預設的資料來源,這個問題主要是因為spring的事務和自定義的aop存在一個先後順序的問題
Spring中的事務是透過aop來實現的,當我們自己寫aop攔截的時候,會遇到跟spring的事務aop執行的先後順序問題,比如說動態切換資料來源的問題,如果事務在前,資料來源切換在後,會導致資料來源切換失效,所以就用到了Order(排序)這個關鍵字.
我們可以透過在@AspectJ的方法中實現org.springframework.core.Ordered 這個介面來定義order的順序,order 的值越小,說明越先被執行。
大家對技術感興趣的朋友也可以來 關注我的微信公眾號 : Java填坑之路 也會分享一些 架構技術資料。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555445/viewspace-2284745/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring Aop實現資料庫讀寫分離Spring資料庫
- 乾貨滿滿 | 微服務化的資料庫設計與讀寫分離微服務資料庫
- Spring Boot + Mybatis 多資料來源配置實現讀寫分離Spring BootMyBatis
- Spring 學習筆記(6)Spring和資料庫程式設計Spring筆記資料庫程式設計
- (7)資料庫讀寫分離,主從同步實現方法(資料庫設定)資料庫主從同步
- 直播賣貨系統,如何實現mysql資料庫的讀寫分離MySql資料庫
- 資料庫讀寫分離資料庫
- 好程式設計師大資料學習路線Hadoop學習乾貨分享程式設計師大資料Hadoop
- 好程式設計師大資料學習路線分享hdfs學習乾貨程式設計師大資料
- 資料庫讀寫分離,主從同步實現方法資料庫主從同步
- 好程式設計師大資料學習路線之zookeeper乾貨程式設計師大資料
- 大資料資料庫讀寫分離分庫分表大資料資料庫
- ShardingSphere(七) 讀寫分離配置,實現分庫讀寫操作
- 好程式設計師Java學習路線分享MyBatis之Spring整合程式設計師JavaMyBatisSpring
- 深度:微服務化的資料庫設計與讀寫分離微服務資料庫
- 好程式設計師Java乾貨分享Spring框架之IOC原理程式設計師JavaSpring框架
- Java乾貨神總結,程式設計師面試技巧Java程式設計師面試
- 資料庫中介軟體sharding-jdbc實現讀寫分離資料庫JDBC
- Docker實現Mariadb分庫分表、讀寫分離Docker
- 阿龍的學習筆記---《程式設計師自我修養-連結、裝載與庫》讀書筆記(二)筆記程式設計師
- 好程式設計師大資料學習筆記:Storm架構程式設計師大資料筆記ORM架構
- 好程式設計師分享自學大資料入門乾貨程式設計師大資料
- 好程式設計師大資料學習路線分享Actor學習筆記程式設計師大資料筆記
- 好程式設計師大資料學習路線分享Map學習筆記程式設計師大資料筆記
- 博學谷 - mysql資料庫效能優化筆記05 - 讀寫分離中介軟體MaxScaleMySql資料庫優化筆記
- 【java深入學習第2章】Spring Boot 結合 Screw:高效生成資料庫設計文件之道JavaSpring Boot資料庫
- 資料庫讀寫分離Master-Slave資料庫AST
- java程式設計師程式設計筆試基礎學習Java程式設計師筆試
- MySQL-SpringBoot整合JPA實現資料讀寫分離MySqlSpring Boot
- springboot+mybatis+druid實現mysql主從讀寫分離(五)Spring BootMyBatisUIMySql
- 資料庫治理利器:動態讀寫分離資料庫
- 結構化程式設計--學習筆記程式設計筆記
- 好程式設計師大資料學習路線分享TCP和UDP學習筆記程式設計師大資料TCPUDP筆記
- 好程式設計師學習筆記:函式程式設計師筆記函式
- 程式設計師生存指南讀書筆記-第三篇(學習)程式設計師筆記
- 好程式設計師Java學習進階之MySQL資料庫結構和引擎比對程式設計師JavaMySql資料庫
- 讀寫分離很難嗎?springboot結合aop簡單就實現了Spring Boot
- ShardingSphere + Mysql,實現分庫分表、讀寫分離,並整合 SpringBootMySqlSpring Boot