欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的實(shí)踐指南

 更新時(shí)間:2025年03月06日 10:25:02   作者:拾荒的小海螺  
在 Java 開(kāi)發(fā)中,許多場(chǎng)景需要訪問(wèn)多個(gè)數(shù)據(jù)庫(kù),例如多租戶系統(tǒng)或讀寫(xiě)分離架構(gòu),為了靈活高效地管理這些場(chǎng)景,動(dòng)態(tài)數(shù)據(jù)源切換技術(shù)應(yīng)運(yùn)而生,所以本文給大家介紹了Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的實(shí)踐指南,需要的朋友可以參考下

1、簡(jiǎn)述

在 Java 開(kāi)發(fā)中,許多場(chǎng)景需要訪問(wèn)多個(gè)數(shù)據(jù)庫(kù),例如多租戶系統(tǒng)或讀寫(xiě)分離架構(gòu)。為了靈活高效地管理這些場(chǎng)景,動(dòng)態(tài)數(shù)據(jù)源切換(Dynamic-DataSource) 技術(shù)應(yīng)運(yùn)而生。

本文介紹如何在 Spring Boot 項(xiàng)目中集成 Dynamic-DataSource 并實(shí)現(xiàn)動(dòng)態(tài)切換功能,最后通過(guò)示例演示實(shí)際應(yīng)用。

2、什么是 Dynamic-DataSource?

Dynamic-DataSource 是一種可以根據(jù)業(yè)務(wù)需求動(dòng)態(tài)切換數(shù)據(jù)源的技術(shù)。常見(jiàn)的使用場(chǎng)景包括:

  • 讀寫(xiě)分離:讀請(qǐng)求路由到只讀數(shù)據(jù)源,寫(xiě)請(qǐng)求路由到主數(shù)據(jù)源。
  • 多租戶系統(tǒng):根據(jù)租戶 ID 動(dòng)態(tài)選擇數(shù)據(jù)庫(kù)。
  • 分庫(kù)分表:根據(jù)分片鍵路由到對(duì)應(yīng)的數(shù)據(jù)源。

通過(guò)動(dòng)態(tài)數(shù)據(jù)源切換,可以避免手動(dòng)管理多個(gè) DataSource,提升開(kāi)發(fā)效率。Dynamic-DataSource 基于 Spring 的 AbstractRoutingDataSource 實(shí)現(xiàn)。核心思想是:

  • 定義多個(gè)數(shù)據(jù)源(如主庫(kù)和從庫(kù))。
  • 使用線程上下文(ThreadLocal)保存當(dāng)前使用的數(shù)據(jù)源標(biāo)識(shí)。
  • 根據(jù)上下文動(dòng)態(tài)選擇數(shù)據(jù)源。

3、集成 Dynamic-DataSource

dynamic-datasource-spring-boot-starter 是一個(gè)基于springboot的快速集成多數(shù)據(jù)源的啟動(dòng)器。

  • 支持 數(shù)據(jù)源分組 ,適用于多種場(chǎng)景 純粹多庫(kù) 讀寫(xiě)分離 一主多從 混合模式。
  • 支持?jǐn)?shù)據(jù)庫(kù)敏感配置信息 加密(可自定義) ENC()。
  • 支持每個(gè)數(shù)據(jù)庫(kù)獨(dú)立初始化表結(jié)構(gòu)schema和數(shù)據(jù)庫(kù)database。
  • 支持無(wú)數(shù)據(jù)源啟動(dòng),支持懶加載數(shù)據(jù)源(需要的時(shí)候再創(chuàng)建連接)。
  • 提供并簡(jiǎn)化對(duì)Druid,HikariCp,BeeCp,Dbcp2的快速集成。

提供對(duì)Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等組件的集成方案。

3.1 Maven引用

在使用 Dynamic-DataSource之前,需要添加其依賴(lài)。以下是 Dynamic-DataSource的 Maven 依賴(lài):

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1</version>
</dependency>
<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.19</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>4.3.0</version>
</dependency>

3.2 配置多數(shù)據(jù)源

在 application.yml 文件中配置多個(gè)數(shù)據(jù)源:

server:
  port: 9001

spring:
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://192.168.25.181:3306/shop_admin?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave_1:
          url: jdbc:mysql://192.168.25.181:3306/slave_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver

3.3 編寫(xiě)動(dòng)態(tài)數(shù)據(jù)源切換邏輯

Dynamic-DataSource Starter 提供了注解和 AOP 的支持,可以簡(jiǎn)化數(shù)據(jù)源切換邏輯。在需要?jiǎng)討B(tài)切換數(shù)據(jù)源的地方添加 @DS 注解:

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lm.shop.shopeureka.entry.SysUserEntity;
import com.lm.shop.shopeureka.mapper.SysUserMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserService extends ServiceImpl<SysUserMapper, SysUserEntity> {

    @Resource
    private SysUserMapper sysUserMapper;

    @DS("master")
    public void insertUser(SysUserEntity user) {
        sysUserMapper.insert(user);
    }

    @DS("slave_1")
    public SysUserEntity getUserById(Long id){
        return sysUserMapper.selectById(id);
    }
}

SysUserMapper:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lm.shop.shopeureka.entry.SysUserEntity;

public interface SysUserMapper extends BaseMapper<SysUserEntity> {
}

SysUserEntity:

package com.lm.shop.shopeureka.entry;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
@TableName("sys_user")
public class SysUserEntity  implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 用戶ID
     */
    @TableId(value = "user_id")
    private Long userId;

    /**
     * 用戶名
     */
    @TableField("username")
    private String username;

    /**
     * 密碼
     */
    @TableField("password")
    private String password;

    /**
     * 鹽
     */
    @TableField("salt")
    private String salt;

    /**
     * 郵箱
     */
    @TableField("email")
    private String email;

    /**
     * 手機(jī)號(hào)
     */
    @TableField("mobile")
    private String mobile;

    /**
     * 狀態(tài)  0:禁用   1:正常
     */
    @TableField("status")
    private Integer status;

    /**
     * 創(chuàng)建者ID
     */
    @TableField("create_user_id")
    private Long createUserId;

    /**
     * 創(chuàng)建時(shí)間
     */
    @TableField("create_time")
    private Date createTime;
}

在Controller控制層添加測(cè)試用例:

import com.lm.shop.shopeureka.entry.SysUserEntity;
import com.lm.shop.shopeureka.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/getUserById")
    public SysUserEntity getUserById(@RequestParam Long id) {
        return userService.getUserById(id);
    }

    @GetMapping("/insert")
    public SysUserEntity insert(@RequestParam Long id) {
        SysUserEntity sysUserEntity = new SysUserEntity();
        sysUserEntity.setEmail("admin@admin.com");
        sysUserEntity.setPassword("123456");
        sysUserEntity.setUsername("adminMaster");
        sysUserEntity.setCreateTime(new Date());
         userService.insertUser(sysUserEntity);
         return sysUserEntity;
    }
}

在啟動(dòng)類(lèi)中添加mapper映射路徑:

@SpringBootApplication
@MapperScan("com.lm.shop.shopeureka.mapper")
public class ShopEurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShopEurekaApplication.class, args);
    }
}

4、總結(jié)

Dynamic-DataSource 提供了一種高效、簡(jiǎn)潔的多數(shù)據(jù)源管理方式,非常適合多租戶系統(tǒng)、讀寫(xiě)分離等復(fù)雜場(chǎng)景。本文通過(guò)配置和實(shí)際案例展示了如何集成和使用 Dynamic-DataSource,幫助開(kāi)發(fā)者快速實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換功能。

通過(guò)動(dòng)態(tài)數(shù)據(jù)源技術(shù),可以顯著提高系統(tǒng)的靈活性和擴(kuò)展性。如果你的項(xiàng)目中涉及多個(gè)數(shù)據(jù)庫(kù)的管理,Dynamic-DataSource 將是一個(gè)強(qiáng)大的工具。

以上就是Java實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的實(shí)踐指南的詳細(xì)內(nèi)容,更多關(guān)于Java動(dòng)態(tài)數(shù)據(jù)源切換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • javaweb實(shí)現(xiàn)簡(jiǎn)易郵件發(fā)送

    javaweb實(shí)現(xiàn)簡(jiǎn)易郵件發(fā)送

    這篇文章主要為大家詳細(xì)介紹了javaweb實(shí)現(xiàn)簡(jiǎn)易郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • scala 讀取txt文件的方法示例

    scala 讀取txt文件的方法示例

    這篇文章主要介紹了scala 讀取txt文件的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Java中的String不可變性實(shí)現(xiàn)

    Java中的String不可變性實(shí)現(xiàn)

    在Java編程中,String類(lèi)的不可變性是一個(gè)被廣泛討論和利用的特性,本文主要介紹了Java中的String不可變性實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法

    Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Maven本地存在jar包IDEA依舊爆紅的完美解決方法

    Maven本地存在jar包IDEA依舊爆紅的完美解決方法

    這篇文章主要介紹了Maven本地存在jar包IDEA依舊爆紅的完美解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • JVM內(nèi)存增強(qiáng)之逃逸分析

    JVM內(nèi)存增強(qiáng)之逃逸分析

    逃逸分析一種數(shù)據(jù)分析算法,基于此算法可以有效減少Java對(duì)象在堆內(nèi)存中的分配。本文將詳細(xì)講講逃逸分析的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-09-09
  • 基于Java手寫(xiě)一個(gè)好用的FTP操作工具類(lèi)

    基于Java手寫(xiě)一個(gè)好用的FTP操作工具類(lèi)

    網(wǎng)上百度了很多FTP的java?工具類(lèi),發(fā)現(xiàn)文章代碼都比較久遠(yuǎn),且代碼臃腫,即使搜到了代碼寫(xiě)的還可以的,封裝的常用操作方法不全面。所以本文將手寫(xiě)一個(gè)好用的Java?FTP操作工具類(lèi),需要的可以參考一下
    2022-04-04
  • Java并發(fā)框架:Executor API詳解

    Java并發(fā)框架:Executor API詳解

    這篇文章主要介紹了Java并發(fā)框架:Executor API詳解,隨著當(dāng)今處理器中可用的核心數(shù)量的增加, 隨著對(duì)實(shí)現(xiàn)更高吞吐量的需求的不斷增長(zhǎng),多線程 API 變得非常流行。 Java 提供了自己的多線程框架,稱(chēng)為 Executor 框架,需要的朋友可以參考下
    2019-07-07
  • java簡(jiǎn)單操作word實(shí)例

    java簡(jiǎn)單操作word實(shí)例

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單操作word實(shí)例,感興趣的朋友可以參考一下
    2016-03-03
  • java身份證驗(yàn)證代碼實(shí)現(xiàn)

    java身份證驗(yàn)證代碼實(shí)現(xiàn)

    java身份證驗(yàn)證代碼實(shí)現(xiàn),需要的朋友可以參考一下
    2013-02-02

最新評(píng)論