最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ShardingProxy讀寫分離之原理、配置與實(shí)踐過程

 更新時(shí)間:2025年08月25日 09:36:40   作者:沒事學(xué)AI  
ShardingProxy是Apache?ShardingSphere的數(shù)據(jù)庫中間件,通過三層架構(gòu)實(shí)現(xiàn)讀寫分離,解決高并發(fā)場景下數(shù)據(jù)庫性能瓶頸,其核心功能包括SQL路由、負(fù)載均衡、數(shù)據(jù)一致性保障和故障轉(zhuǎn)移,支持主從架構(gòu)下的透明分庫分表及讀寫分流,廣泛應(yīng)用于微服務(wù)和高流量業(yè)務(wù)系統(tǒng)

一、ShardingProxy技術(shù)定位與讀寫分離核心價(jià)值

1.1 技術(shù)定位

ShardingProxy是Apache ShardingSphere生態(tài)中的數(shù)據(jù)庫中間件,采用客戶端-代理-數(shù)據(jù)庫的三層架構(gòu)模式,對應(yīng)用程序透明(無需修改應(yīng)用代碼),負(fù)責(zé)接收應(yīng)用的SQL請求并進(jìn)行路由轉(zhuǎn)發(fā)。其核心定位是:作為分布式數(shù)據(jù)庫的“流量入口”,解決單機(jī)數(shù)據(jù)庫在高并發(fā)場景下的性能瓶頸,支持讀寫分離、分庫分表、數(shù)據(jù)脫敏等核心能力,在微服務(wù)架構(gòu)、高流量業(yè)務(wù)系統(tǒng)(如電商訂單、用戶中心)中廣泛應(yīng)用。

在整個(gè)技術(shù)體系中,ShardingProxy處于“應(yīng)用層與數(shù)據(jù)庫層之間的中間件層”,上接應(yīng)用服務(wù)的SQL請求,下連主從架構(gòu)的數(shù)據(jù)庫集群,承擔(dān)SQL解析、路由決策、結(jié)果合并等關(guān)鍵職責(zé),是實(shí)現(xiàn)數(shù)據(jù)庫水平擴(kuò)展的核心組件之一。

1.2 讀寫分離核心價(jià)值

在傳統(tǒng)單機(jī)數(shù)據(jù)庫架構(gòu)中,“讀”和“寫”操作均依賴同一臺(tái)數(shù)據(jù)庫,當(dāng)業(yè)務(wù)流量增長(如秒殺活動(dòng)、高頻查詢場景)時(shí),讀請求會(huì)大量占用數(shù)據(jù)庫資源,導(dǎo)致寫操作響應(yīng)延遲,甚至引發(fā)數(shù)據(jù)庫性能雪崩。

ShardingProxy讀寫分離的核心價(jià)值在于拆分讀寫流量

  • 將“寫操作”(INSERT/UPDATE/DELETE)路由至主庫,保證數(shù)據(jù)一致性;
  • 將“讀操作”(SELECT)路由至從庫,利用從庫集群分擔(dān)讀壓力;
  • 支持從庫負(fù)載均衡,避免單從庫成為新瓶頸;
  • 提供故障轉(zhuǎn)移能力,當(dāng)某臺(tái)從庫下線時(shí),自動(dòng)將讀流量切換至其他可用從庫。

二、ShardingProxy讀寫分離核心原理

2.1 整體工作流程

ShardingProxy實(shí)現(xiàn)讀寫分離的核心流程分為5個(gè)步驟,具體如下:

步驟核心操作說明
1SQL接收應(yīng)用通過JDBC/ODBC協(xié)議連接ShardingProxy(代理地址與端口),發(fā)送SQL請求
2SQL解析ShardingProxy對SQL進(jìn)行語法解析、語義分析,判斷SQL類型(讀/寫)
3路由決策根據(jù)預(yù)設(shè)的讀寫分離規(guī)則,決定將請求路由至主庫(寫操作)或從庫(讀操作);若為讀操作,還需通過負(fù)載均衡算法選擇具體從庫
4請求轉(zhuǎn)發(fā)將解析后的SQL轉(zhuǎn)發(fā)至目標(biāo)數(shù)據(jù)庫(主庫/從庫)
5結(jié)果返回接收目標(biāo)數(shù)據(jù)庫的執(zhí)行結(jié)果,若涉及多從庫(如分頁查詢合并)則進(jìn)行結(jié)果處理,最終返回給應(yīng)用

2.2 關(guān)鍵技術(shù)點(diǎn)

2.2.1 SQL類型判斷

ShardingProxy通過SQL語法樹解析區(qū)分讀寫操作:

  • 寫操作判定:包含INSERT、UPDATE、DELETE、CREATE、ALTER等會(huì)修改數(shù)據(jù)或表結(jié)構(gòu)的SQL;
  • 讀操作判定:僅包含SELECT的SQL(特殊場景如SELECT … FOR UPDATE會(huì)被判定為寫操作,需單獨(dú)配置)。

2.2.2 從庫負(fù)載均衡算法

ShardingProxy支持3種常用負(fù)載均衡算法,滿足不同業(yè)務(wù)場景需求:

  • 輪詢算法(ROUND_ROBIN):按從庫順序依次分配讀請求,適用于各從庫配置一致的場景;
  • 隨機(jī)算法(RANDOM):隨機(jī)選擇從庫分配請求,適用于從庫性能存在輕微差異的場景;
  • 權(quán)重算法(WEIGHT):根據(jù)從庫權(quán)重分配請求(權(quán)重越高,接收請求越多),適用于從庫配置差異較大的場景(如高性能從庫權(quán)重設(shè)為10,普通從庫設(shè)為5)。

2.2.3 主從數(shù)據(jù)一致性保障

由于主從復(fù)制存在延遲(MySQL默認(rèn)異步復(fù)制),可能導(dǎo)致“寫主庫后立即讀從庫”出現(xiàn)數(shù)據(jù)不一致問題。ShardingProxy提供2種解決方案:

  1. 強(qiáng)制路由主庫:對核心業(yè)務(wù)讀請求(如用戶下單后查詢訂單狀態(tài)),通過Hint語法強(qiáng)制路由至主庫;
  2. 主從延遲控制:配置從庫延遲閾值(如500ms),當(dāng)從庫延遲超過閾值時(shí),自動(dòng)將讀請求路由至主庫,避免臟讀。

三、ShardingProxy讀寫分離環(huán)境搭建與配置

3.1 前置環(huán)境準(zhǔn)備

搭建ShardingProxy讀寫分離需滿足以下環(huán)境依賴,以MySQL主從架構(gòu)為例:

組件版本要求說明
JDK1.8及以上ShardingProxy基于Java開發(fā),需配置JAVA_HOME
MySQL5.7/8.0需提前搭建MySQL主從復(fù)制(異步/半同步均可)
ShardingProxy4.1.1(穩(wěn)定版)從Apache官網(wǎng)下載

MySQL主從復(fù)制驗(yàn)證

確保主從復(fù)制正常運(yùn)行,在主庫執(zhí)行以下SQL創(chuàng)建測試表并插入數(shù)據(jù),從庫需能同步數(shù)據(jù):

-- 主庫創(chuàng)建測試庫
CREATE DATABASE IF NOT EXISTS sharding_db;
USE sharding_db;

-- 創(chuàng)建用戶表
CREATE TABLE `t_user` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL,
  `age` INT NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 插入測試數(shù)據(jù)(從庫需同步該數(shù)據(jù))
INSERT INTO t_user (username, age) VALUES ('zhangsan', 25), ('lisi', 30);

3.2 ShardingProxy核心配置

ShardingProxy的配置文件位于conf目錄下,核心配置文件為server.yaml(全局配置)和config-sharding.yaml(讀寫分離+分庫分表配置)。

3.2.1 server.yaml配置(全局基礎(chǔ)配置)

# 服務(wù)端口(應(yīng)用連接ShardingProxy的端口)
serverPort: 3307
# 管理端口(用于監(jiān)控和運(yùn)維)
adminPort: 8088
# 數(shù)據(jù)庫驅(qū)動(dòng)類名
driverClassName: com.mysql.cj.jdbc.Driver
# 認(rèn)證配置(應(yīng)用連接ShardingProxy的賬號密碼)
authentication:
  users:
    root:
      password: 123456  # 應(yīng)用連接密碼
    sharding:
      password: sharding 
      authorizedSchemas: sharding_db  # 授權(quán)訪問的數(shù)據(jù)庫

# 日志配置(輸出SQL路由日志,便于調(diào)試)
props:
  max.connections.size.per.query: 1
  acceptor.size: 16  # 用于接收連接的線程數(shù)
  executor.size: 16  # 用于處理SQL的線程數(shù)
  proxy.frontend.flush.threshold: 128  # 前端刷盤閾值
  proxy.transaction.type: LOCAL
  proxy.opentracing.enabled: false
  query.with.cipher.column: true
  sql.show: true  # 開啟SQL顯示(打印路由后的SQL,調(diào)試必備)

3.2.2 config-sharding.yaml配置(讀寫分離核心配置)

# 數(shù)據(jù)源配置(主庫+從庫)
dataSources:
  # 主庫數(shù)據(jù)源
  master_ds:
    type: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://192.168.1.100:3306/sharding_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: root
    password: root123
    connectionTimeout: 30000
    idleTimeout: 60000
    maxLifetime: 1800000
    maximumPoolSize: 50
  
  # 從庫1數(shù)據(jù)源
  slave_ds_0:
    type: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://192.168.1.101:3306/sharding_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: root
    password: root123
    connectionTimeout: 30000
    idleTimeout: 60000
    maxLifetime: 1800000
    maximumPoolSize: 50
  
  # 從庫2數(shù)據(jù)源(可擴(kuò)展多個(gè)從庫)
  slave_ds_1:
    type: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://192.168.1.102:3306/sharding_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: root
    password: root123
    connectionTimeout: 30000
    idleTimeout: 60000
    maxLifetime: 1800000
    maximumPoolSize: 50

# 讀寫分離規(guī)則配置
rules:
- !READWRITE_SPLITTING
  dataSources:
    # 讀寫分離數(shù)據(jù)源名稱(應(yīng)用實(shí)際訪問的數(shù)據(jù)源名)
    sharding_rw_ds:
      type: Static
      props:
        write-data-source-name: master_ds  # 寫操作路由至主庫
        read-data-source-names: slave_ds_0,slave_ds_1  # 讀操作路由至兩個(gè)從庫
        load-balance-algorithm-type: ROUND_ROBIN  # 從庫負(fù)載均衡算法(輪詢)
        # 可選:主從延遲控制(超過500ms則讀主庫)
        # read-write-splitting-delay-threshold: 500

# 綁定表規(guī)則(無分表時(shí)可省略,此處僅作示例)
bindingTables:
- t_user

# 默認(rèn)數(shù)據(jù)源(當(dāng)SQL未匹配任何規(guī)則時(shí),路由至該數(shù)據(jù)源)
defaultDataSourceName: sharding_rw_ds

3.3 ShardingProxy啟動(dòng)與驗(yàn)證

3.3.1 啟動(dòng)ShardingProxy

進(jìn)入ShardingProxy的bin目錄;

執(zhí)行啟動(dòng)腳本(Windows用start.bat,Linux用start.sh):

# Linux啟動(dòng)命令(指定配置文件目錄)
./start.sh ../conf

驗(yàn)證啟動(dòng)狀態(tài):查看logs/stdout.log日志,若出現(xiàn)以下內(nèi)容則啟動(dòng)成功:

[INFO ] 2024-05-20 10:00:00.000 [main] o.a.s.p.frontend.ShardingSphereProxy - ShardingSphere-Proxy start success.

3.3.2 連接驗(yàn)證(使用Navicat/MySQL客戶端)

連接參數(shù):

  • 主機(jī):ShardingProxy所在服務(wù)器IP(如192.168.1.103);
  • 端口:3307(對應(yīng)server.yaml中的serverPort);
  • 賬號:root(對應(yīng)server.yaml中的認(rèn)證用戶);
  • 密碼:123456(對應(yīng)server.yaml中的認(rèn)證密碼);
  • 數(shù)據(jù)庫:sharding_db(授權(quán)數(shù)據(jù)庫)。

執(zhí)行讀寫操作驗(yàn)證:

-- 1. 寫操作(INSERT):查看ShardingProxy日志,確認(rèn)路由至master_ds
INSERT INTO t_user (username, age) VALUES ('wangwu', 35);

-- 2. 讀操作(SELECT):查看日志,確認(rèn)輪詢路由至slave_ds_0、slave_ds_1
SELECT * FROM t_user;

-- 3. 強(qiáng)制讀主庫(Hint語法):核心業(yè)務(wù)讀請求用此方式保障一致性
/*!SHARDINGSPHERE_HINT: DATA_SOURCE_NAME=master_ds */ 
SELECT * FROM t_user WHERE id = 3;

四、工程實(shí)踐:SpringBoot整合ShardingProxy讀寫分離

4.1 項(xiàng)目依賴配置(pom.xml)

在SpringBoot項(xiàng)目中添加MySQL驅(qū)動(dòng)和JDBC依賴(無需添加ShardingSphere客戶端依賴,因應(yīng)用僅需連接ShardingProxy,無需感知中間件細(xì)節(jié)):

<dependencies>
    <!-- SpringBoot JDBC Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    
    <!-- MySQL驅(qū)動(dòng) -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.32</version>
        <scope>runtime</scope>
    </dependency>
    
    <!-- 數(shù)據(jù)庫連接池(HikariCP) -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
    
    <!-- SpringBoot Test(用于測試) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

4.2 數(shù)據(jù)庫配置(application.yml)

應(yīng)用連接ShardingProxy的配置,與連接普通MySQL數(shù)據(jù)庫一致(無需修改代碼,完全透明):

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.1.103:3307/sharding_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: root
    password: 123456
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      connection-timeout: 30000
      idle-timeout: 600000

4.3 業(yè)務(wù)代碼實(shí)現(xiàn)(用戶模塊示例)

4.3.1 實(shí)體類(User.java)

public class User {
    private Long id;
    private String username;
    private Integer age;

    // 無參構(gòu)造、有參構(gòu)造、getter、setter
    public User() {}
    public User(String username, Integer age) {
        this.username = username;
        this.age = age;
    }

    // getter和setter
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
}

4.3.2 DAO層(UserDao.java)

使用JdbcTemplate實(shí)現(xiàn)數(shù)據(jù)訪問(MyBatis/MyBatis-Plus用法一致,僅需配置數(shù)據(jù)源):

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;

@Repository
public class UserDao {
    @Resource
    private JdbcTemplate jdbcTemplate;

    // 寫操作:新增用戶(路由至主庫)
    public int addUser(User user) {
        String sql = "INSERT INTO t_user (username, age) VALUES (?, ?)";
        return jdbcTemplate.update(sql, user.getUsername(), user.getAge());
    }

    // 讀操作:查詢所有用戶(路由至從庫,輪詢)
    public List<User> listAllUsers() {
        String sql = "SELECT id, username, age FROM t_user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    // 讀操作:強(qiáng)制讀主庫(核心業(yè)務(wù),保障數(shù)據(jù)一致性)
    public User getUserById(Long id) {
        // Hint語法:強(qiáng)制路由至主庫
        String sql = "/*!SHARDINGSPHERE_HINT: DATA_SOURCE_NAME=master_ds */ " +
                     "SELECT id, username, age FROM t_user WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
    }
}

4.4 測試代碼(UserDaoTest.java)

通過單元測試驗(yàn)證讀寫分離效果:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
public class UserDaoTest {
    @Resource
    private UserDao userDao;

    // 測試寫操作(路由至主庫)
    @Test
    public void testAddUser() {
        User user = new User("zhaoliu", 40);
        int rows = userDao.addUser(user);
        assertEquals(1, rows); // 新增成功返回1
    }

    // 測試讀操作(路由至從庫,輪詢)
    @Test
    public void testListAllUsers() {
        List<User> userList = userDao.listAllUsers();
        assertNotNull(userList);
        System.out.println("查詢用戶數(shù)量:" + userList.size());
        // 連續(xù)查詢3次,觀察ShardingProxy日志,確認(rèn)從庫輪詢(slave_ds_0 → slave_ds_1 → slave_ds_0)
        for (int i = 0; i < 3; i++) {
            userDao.listAllUsers();
        }
    }

    // 測試強(qiáng)制讀主庫(保障數(shù)據(jù)一致性)
    @Test
    public void testGetUserById() {
        // 先新增用戶(寫主庫)
        User user = new User("qianqi", 28);
        userDao.addUser(user);
        // 立即查詢剛新增的用戶(強(qiáng)制讀主庫,避免主從延遲導(dǎo)致查不到數(shù)據(jù))
        User result = userDao.getUserById(user.getId());
        assertNotNull(result);
        assertEquals("qianqi", result.getUsername());
    }
}


## 五、常見問題與解決方案
### 5.1 主從數(shù)據(jù)不一致
#### 問題表現(xiàn)
應(yīng)用執(zhí)行“寫主庫后立即讀從庫”時(shí),可能查詢不到最新數(shù)據(jù)(因主從復(fù)制存在延遲)。

#### 解決方案
1. **強(qiáng)制路由主庫**:對核心業(yè)務(wù)場景(如用戶注冊后立即查詢用戶信息),使用Hint語法強(qiáng)制讀主庫:
   ```sql
   /*!SHARDINGSPHERE_HINT: DATA_SOURCE_NAME=master_ds */ 
   SELECT * FROM t_user WHERE id = ?

配置延遲閾值:在config-sharding.yaml中設(shè)置read-write-splitting-delay-threshold(單位:毫秒),當(dāng)從庫延遲超過閾值時(shí),自動(dòng)路由至主庫:

props:
  read-write-splitting-delay-threshold: 500  # 從庫延遲>500ms時(shí)讀主庫

5.2 從庫故障導(dǎo)致讀失敗

問題表現(xiàn)

某臺(tái)從庫宕機(jī)或網(wǎng)絡(luò)故障時(shí),ShardingProxy若仍將請求路由至該從庫,會(huì)導(dǎo)致讀操作失敗。

解決方案

ShardingProxy默認(rèn)支持從庫故障檢測與自動(dòng)剔除,需在config-sharding.yaml中配置健康檢查參數(shù):

dataSources:
  slave_ds_0:
    # 其他配置省略...
    health:
      check:
        enable: true  # 開啟健康檢查
        timeout: 3000  # 檢查超時(shí)時(shí)間(毫秒)
        interval: 5000  # 檢查間隔(毫秒)
  slave_ds_1:
    # 同上配置...

配置后,當(dāng)從庫連續(xù)3次健康檢查失敗,ShardingProxy會(huì)將其從可用列表中剔除;恢復(fù)正常后,自動(dòng)重新加入。

5.3 SQL路由錯(cuò)誤

問題表現(xiàn)

某些特殊SQL(如SELECT ... FOR UPDATE)被誤判為讀操作,路由至從庫導(dǎo)致執(zhí)行失?。◤膸炷J(rèn)只讀)。

解決方案

config-sharding.yaml中配置SQL路由規(guī)則,修正特殊SQL的路由邏輯:

rules:
- !READWRITE_SPLITTING
  dataSources:
    sharding_rw_ds:
      # 其他配置省略...
      props:
        # 自定義SQL路由規(guī)則:將包含F(xiàn)OR UPDATE的SELECT視為寫操作
        sql-parser-rule: "SELECT.*FOR UPDATE"
        sql-parser-rule-type: WRITE  # 匹配上述規(guī)則的SQL視為寫操作

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot 默認(rèn)數(shù)據(jù)庫連接池 HikariCP全文解析

    Spring Boot 默認(rèn)數(shù)據(jù)庫連接池 HikariCP全文解析

    HikariCP是SpringBoot默認(rèn)的高性能數(shù)據(jù)庫連接池,通過合理配置可以顯著提升系統(tǒng)性能,文章詳細(xì)介紹了HikariCP的核心參數(shù)及最佳實(shí)踐,,文章列舉了常見的錯(cuò)誤配置及其可能導(dǎo)致的問題,并推薦了適用于大多數(shù)中小型SpringBoot項(xiàng)目的穩(wěn)定生產(chǎn)配置,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Springboot測試類沒有bean注入問題解析

    Springboot測試類沒有bean注入問題解析

    這篇文章主要介紹了Springboot測試類沒有bean注入問題解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java實(shí)現(xiàn)List與數(shù)組互轉(zhuǎn)(Arrays.asList與Collectors.toList)的兩種方法

    Java實(shí)現(xiàn)List與數(shù)組互轉(zhuǎn)(Arrays.asList與Collectors.toList)的兩種方法

    在 Java 編程中,List 和數(shù)組(Array)是兩種常用的數(shù)據(jù)結(jié)構(gòu),本文將深入探討 List 與數(shù)組之間的相互轉(zhuǎn)換,重點(diǎn)介紹 Arrays.asList 和 Collectors.toList 這兩種常用且重要的方法,并分析它們的特點(diǎn)、適用場景及注意事項(xiàng),需要的朋友可以參考下
    2026-01-01
  • Java源碼解析之object類

    Java源碼解析之object類

    前些天看到別人討論閱讀源碼有什么用這個(gè)問題,有一句話說的特別好:學(xué)習(xí)別人實(shí)現(xiàn)某個(gè)功能的設(shè)計(jì)思路,來提高自己的編程水平。本文主要介紹了Java源碼解析之object類,需要的朋友可以參考。
    2017-10-10
  • Spring?AOP利用切面實(shí)現(xiàn)日志保存的示例詳解

    Spring?AOP利用切面實(shí)現(xiàn)日志保存的示例詳解

    最近領(lǐng)導(dǎo)讓寫個(gè)用切面實(shí)現(xiàn)日志保存,經(jīng)過調(diào)研和親測,以完美解決。在這里分享給大家,給有需要的碼友直接使用,希望對大家有所幫助
    2022-11-11
  • Java如何實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能

    Java如何實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能

    這篇文章主要教大家如何實(shí)現(xiàn)Java驗(yàn)證碼驗(yàn)證功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • spring-boot-maven-plugin?配置有啥用

    spring-boot-maven-plugin?配置有啥用

    這篇文章主要介紹了spring-boot-maven-plugin?配置是干啥的,這個(gè)是SpringBoot的Maven插件,主要用來打包的,通常打包成jar或者war文件,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Java中volatile關(guān)鍵字的線程的可見性、有序性詳解

    Java中volatile關(guān)鍵字的線程的可見性、有序性詳解

    這篇文章主要介紹了Java中volatile關(guān)鍵字的線程的可見性、有序性詳解,在juc多線程并發(fā)編程中,常常需要關(guān)注線程的"可見性"與"有序性",本文將詳細(xì)介紹這兩部分內(nèi)容,以及volatile關(guān)鍵字的使用,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于Java創(chuàng)建線程的2種方式以及對比

    關(guān)于Java創(chuàng)建線程的2種方式以及對比

    這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建線程的2種方式以及對比的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Spring中的ApplicationContext與BeanFactory詳解

    Spring中的ApplicationContext與BeanFactory詳解

    這篇文章主要介紹了Spring中的ApplicationContext與BeanFactory詳解,Spring的IoC容器就是一個(gè)實(shí)現(xiàn)了BeanFactory接口的可實(shí)例化類,事實(shí)上, Spring提供了兩種不同的容器,一種是最基本的BeanFactory,另一種是擴(kuò)展的ApplicationContext,需要的朋友可以參考下
    2024-01-01

最新評論

呼玛县| 铅山县| 车致| 龙南县| 自贡市| 宁南县| 阿城市| 高青县| 龙岩市| 中方县| 大埔县| 洪湖市| 五华县| 利津县| 巴彦淖尔市| 裕民县| 达州市| 永丰县| 长治市| 玛沁县| 静乐县| 华蓥市| 连云港市| 呼玛县| 庆阳市| 平利县| 绿春县| 洞头县| 普安县| 东港市| 会同县| 广西| 苍山县| 阿拉善左旗| 新营市| 当涂县| 习水县| 高平市| 郎溪县| 新化县| 重庆市|