91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java程序員干貨學習筆記—Spring結合MyBatis實現數據庫讀寫分離

發布時間:2020-08-18 12:50:26 來源:ITPUB博客 閱讀:138 作者:忙碌的程序員 欄目:編程語言

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接口上面

Java程序員干貨學習筆記—Spring結合MyBatis實現數據庫讀寫分離

數據庫表就一張 根據mybatis的xml大家自己建一下

另外這里還有一個瑕疵就是,當你使用注解事務的時候系統只能讀取默認的數據源,這個問題主要是因為spring的事務和自定義的aop存在一個先后順序的問題

Spring中的事務是通過aop來實現的,當我們自己寫aop攔截的時候,會遇到跟spring的事務aop執行的先后順序問題,比如說動態切換數據源的問題,如果事務在前,數據源切換在后,會導致數據源切換失效,所以就用到了Order(排序)這個關鍵字.

我們可以通過在@AspectJ的方法中實現org.springframework.core.Ordered 這個接口來定義order的順序,order 的值越小,說明越先被執行。

大家對技術感興趣的朋友也可以來 關注我的微信公眾號 Java填坑之路      也會分享一些 架構技術資料。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丁青县| 牙克石市| 岳阳市| 宁南县| 扎赉特旗| 乃东县| 桓台县| 普安县| 平山县| 长岭县| 山西省| 扬州市| 龙井市| 平乡县| 西宁市| 武汉市| 固安县| 榆树市| 岗巴县| 齐齐哈尔市| 陆丰市| 奉化市| 沅陵县| 延川县| 历史| 调兵山市| 潮州市| 柳江县| 渭南市| 水城县| 丹巴县| 凤凰县| 灵宝市| 东台市| 兴化市| 卢龙县| 巩留县| 慈利县| 呼伦贝尔市| 四子王旗| 称多县|