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

Java實現動態(tài)數據源切換的實踐指南

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

1、簡述

在 Java 開發(fā)中,許多場景需要訪問多個數據庫,例如多租戶系統(tǒng)或讀寫分離架構。為了靈活高效地管理這些場景,動態(tài)數據源切換(Dynamic-DataSource) 技術應運而生。

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

2、什么是 Dynamic-DataSource?

Dynamic-DataSource 是一種可以根據業(yè)務需求動態(tài)切換數據源的技術。常見的使用場景包括:

  • 讀寫分離:讀請求路由到只讀數據源,寫請求路由到主數據源。
  • 多租戶系統(tǒng):根據租戶 ID 動態(tài)選擇數據庫。
  • 分庫分表:根據分片鍵路由到對應的數據源。

通過動態(tài)數據源切換,可以避免手動管理多個 DataSource,提升開發(fā)效率。Dynamic-DataSource 基于 Spring 的 AbstractRoutingDataSource 實現。核心思想是:

  • 定義多個數據源(如主庫和從庫)。
  • 使用線程上下文(ThreadLocal)保存當前使用的數據源標識。
  • 根據上下文動態(tài)選擇數據源。

3、集成 Dynamic-DataSource

dynamic-datasource-spring-boot-starter 是一個基于springboot的快速集成多數據源的啟動器。

  • 支持 數據源分組 ,適用于多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
  • 支持數據庫敏感配置信息 加密(可自定義) ENC()。
  • 支持每個數據庫獨立初始化表結構schema和數據庫database。
  • 支持無數據源啟動,支持懶加載數據源(需要的時候再創(chuàng)建連接)。
  • 提供并簡化對Druid,HikariCp,BeeCp,Dbcp2的快速集成。

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

3.1 Maven引用

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

<!-- 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 配置多數據源

在 application.yml 文件中配置多個數據源:

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 編寫動態(tài)數據源切換邏輯

Dynamic-DataSource Starter 提供了注解和 AOP 的支持,可以簡化數據源切換邏輯。在需要動態(tài)切換數據源的地方添加 @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;

    /**
     * 手機號
     */
    @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)建時間
     */
    @TableField("create_time")
    private Date createTime;
}

在Controller控制層添加測試用例:

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;
    }
}

在啟動類中添加mapper映射路徑:

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

4、總結

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

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

以上就是Java實現動態(tài)數據源切換的實踐指南的詳細內容,更多關于Java動態(tài)數據源切換的資料請關注腳本之家其它相關文章!

相關文章

最新評論

都昌县| 永顺县| 海口市| 博野县| 潮州市| 渝中区| 无极县| 博野县| 张掖市| 巴彦淖尔市| 怀仁县| 新民市| 萨迦县| 清水县| 醴陵市| 遂昌县| 梅河口市| 无锡市| 新营市| 盐源县| 新乡市| 晋州市| 昂仁县| 敖汉旗| 高要市| 东辽县| 襄城县| 布拖县| 武安市| 中山市| 申扎县| 广平县| 获嘉县| 龙陵县| 北京市| 丹江口市| 巩义市| 晋宁县| 手游| 灯塔市| 休宁县|