기능적 특징:
다양한 시나리오, 순수 다중 데이터베이스, 읽기-쓰기 분리, 하나의 마스터, 다중 슬레이브, 혼합 모드에 적합한 데이터 소스 그룹화를 지원합니다.
데이터 소스 없이 시작을 지원하고 지연 시작 데이터 소스 구성을 지원합니다(3.3.2+).
데이터베이스에 민감한 구성 정보 암호화 ENC()를 지원합니다.
각 데이터베이스를 지원하여 테이블 구조 스키마와 데이터베이스 데이터베이스를 독립적으로 초기화합니다.
맞춤 주석을 지원하며 DS(3.2.0+)를 상속해야 합니다.
Druid, Mybatis-Plus, P6sy, Jndi에 대한 빠른 통합을 제공합니다.
Druid 및 HikariCp 구성을 단순화하고 전역 매개변수 구성을 제공합니다. 한 번 구성하여 전 세계적으로 사용하세요.
맞춤형 데이터 소스 솔루션을 제공하세요.
프로젝트 시작 후 데이터 소스를 동적으로 추가 및 제거하는 솔루션을 제공합니다.
Mybatis 환경에서 순수한 읽기-쓰기 분리 솔루션을 제공합니다.
SpEL 동적 매개변수를 사용하여 데이터 소스 솔루션을 구문 분석하는 방법을 제공합니다. 내장된 철자, 세션, 헤더, 지원 사용자 정의.
다층 데이터 소스의 중첩된 전환을 지원합니다. (서비스A >>>> 서비스B >>> 서비스C).
shiro, sharding-jdbc, quartz 등과 같은 타사 라이브러리 통합을 위한 솔루션, 예방 조치 및 예제를 제공합니다.
Seata 기반의 분산 거래 솔루션을 제공합니다. 첨부: 네이티브 스프링 트랜잭션은 지원되지 않습니다.
로컬 다중 데이터 소스 트랜잭션 솔루션을 제공합니다. 첨부: 네이티브 스프링 트랜잭션(3.3.1+)은 지원되지 않습니다.
저희 글은 주로 읽기와 쓰기의 분리, 1마스터-다중-슬레이브 환경을 구현합니다.
메인 데이터베이스는 INSERT, UPDATE, DELETE 작업만 수행하는 것이 좋습니다.
데이터베이스에서만 SELECT 작업을 수행하는 것이 좋습니다.
1. 데이터베이스 준비
메인 데이터베이스: PiaoDB
슬레이브 데이터베이스 1: PiaoDB2
슬레이브 데이터베이스 2: PiaoDB3
2. POM 파일 가져오기
동적 데이터 소스-스프링-부트-스타터를 소개합니다.
<!-- 多数据源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.3.2</version> </dependency>
3. 구성 파일을 편집합니다
마스터 라이브러리와 두 개의 슬레이브 라이브러리를 구성했습니다.
구성 파일에서 밑줄 _로 구분된 모든 데이터 소스의 "헤더"는 그룹 이름이 동일한 데이터 소스가 하나의 그룹에 배치됩니다.
기본 데이터 소스 이름은 master 이며 spring.datasource.dynamic.primary를 통해 수정할 수 있습니다.
spring: datasource: dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源. datasource: master: url: jdbc:mysql://localhost:3306/PiaoDB?serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置 slave_1: url: jdbc:mysql://localhost:3306/PiaoDB2?serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver slave_2: url: jdbc:mysql://localhost:3306/PiaoDB3?serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.jdbc.Driver
Alibaba 데이터베이스 연결 풀 Druid를 사용하고 있기 때문에 기본 Druid의 빠른 구성 클래스를 제외해야 합니다.
기타 타사 통합 주소: Druid 통합
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
일부 springBoot 버전은 제외할 수 없으며 다음과 같은 방법으로 제외할 수 있습니다.
spring: autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
하나의 마스터와 여러 개의 슬레이브를 구성하는 것 외에도 구성할 수도 있습니다.
# 多主多从 纯粹多库(记得设置primary) 混合配置 spring: spring: spring: datasource: datasource: datasource: dynamic: dynamic: dynamic: datasource: datasource: datasource: master_1: mysql: master: master_2: oracle: slave_1: slave_1: sqlserver: slave_2: slave_2: postgresql: oracle_1: slave_3: h3: oracle_2:
4. 코드 작성
@DS를 사용하여 데이터 소스를 전환하세요. @DS는 메서드와 클래스에 주석을 달 수 있습니다. 둘 다 존재하는 경우 메소드 주석이 클래스 주석보다 우선합니다. 서비스 구현이나 매퍼 인터페이스 메소드에 주석을 추가하는 것이 좋습니다.
@DS("xxx")는 데이터 소스 xxx의 사용을 지정합니다. 여기서 xxx는 그룹 이름이거나 특정 라이브러리의 이름일 수 있습니다. 그룹 이름인 경우 전환 시 로드밸런싱 알고리즘을 사용합니다. 지정한 그룹명이나 라이브러리가 없으면 자동으로 기본 데이터소스(메인 라이브러리)가 사용됩니다
@DS가 없으면 기본 데이터소스(메인 라이브러리)가 사용됩니다
@DS인 경우 설정되었지만 지정되지 않았습니다. 특정 그룹이나 라이브러리의 경우 DynamicDataSourceStrategy 전략에 따라 슬레이브 라이브러리를 선택합니다. 기본 부하 분산 정책입니다.
1. 쓰기 컨트롤러
@RestController @RequiredArgsConstructor @RequestMapping("/demo") public class DemoController { private final DemoService demoService; @GetMapping("/add") public String add() { return demoService.add(null) + ""; } @GetMapping("/selectGoodsInfo") public List<GoodsInfo> selectGoodsInfo(){ return demoService.selectGoodsInfo(); } @GetMapping("/selectMasterGoodsInfo") public List<GoodsInfo> selectMasterGoodsInfo(){ return demoService.selectMasterGoodsInfo(); } }
public interface DemoService { boolean add(GoodsInfo param); List<GoodsInfo> selectGoodsInfo(); List<GoodsInfo> selectMasterGoodsInfo(); }
3. 쓰기 맵퍼
@Service @RequiredArgsConstructor public class DemoServiceImpl implements DemoService { private final DemoMapper demoMapper; @DS("master") @Override public boolean add(GoodsInfo param) { param = new GoodsInfo(); param.setGname("1200元秒杀华为Pad"); param.setGnum(100); return demoMapper.insertGoodsInfo(param); } @DS("slave") @Override public List<GoodsInfo> selectGoodsInfo() { return demoMapper.selectGoodsInfo(); } @DS("master") @Override public List<GoodsInfo> selectMasterGoodsInfo() { return demoMapper.selectGoodsInfo(); } }
@Mapper public interface DemoMapper { boolean insertGoodsInfo(GoodsInfo param); List<GoodsInfo> selectGoodsInfo(); }5. 새로운 인터페이스 요청(메인 라이브러리에 데이터 추가): 127.0. 0.1:8086/demo/add
2. 마스터 데이터베이스 데이터 인터페이스 쿼리 요청: 127.0.0.1:8086/demo/selectMasterGoodsInfo
3 슬레이브 데이터베이스 데이터 인터페이스 요청(로드 밸런싱):
먼저. 요청 :
두 번째 요청 :
위 내용은 Dynamic Datasource를 사용하여 SpringBoot에서 여러 데이터 소스를 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!