SpringBoot で動的データソースを使用して複数のデータソースを構成する方法

PHPz
リリース: 2023-05-16 19:07:23
転載
2650 人が閲覧しました

機能的特徴:

  1. さまざまなシナリオに適したデータ ソースのグループ化、純粋なマルチデータベース、読み取りと書き込みの分離、1 つのマスター、複数のデータ ソースのグループ化をサポートスレーブ、混合モード。

  2. データ ソースなしの起動をサポートし、遅延起動データ ソースの構成をサポートします (3.3.2)。

  3. データベースの機密構成情報の暗号化 ENC() をサポートします。

  4. 各データベースのテーブル構造スキーマとデータベース データベースの独立した初期化をサポートします。

  5. カスタム アノテーションをサポートし、DS (3.2.0) を継承する必要があります。

  6. Druid、Mybatis-Plus、P6sy、Jndi の高速統合を提供します。

  7. Druid と HikariCp の構成を簡素化し、グローバル パラメーター構成を提供します。一度設定すれば、それをグローバルに使用できます。

  8. カスタム データ ソース ソリューションを提供します。

  9. プロジェクトの開始後にデータ ソースを動的に追加および削除するためのソリューションを提供します。

  10. Mybatis 環境で純粋な読み取り/書き込み分離ソリューションを提供します。

  11. SpEL 動的パラメーターを使用して、データ ソース スキームを解析するメソッドを提供します。組み込みのスペル、セッション、ヘッダー、サポートのカスタマイズ。

  12. マルチレイヤー データ ソースのネストされた切り替えをサポートします。 (サービス A >>> サービス B >>> サービス C)。

  13. hiro、sharding-jdbc、quartz などのサードパーティ ライブラリを統合するためのソリューション、注意事項、および例を提供します。

  14. Seata に基づいた分散トランザクション ソリューションを提供します。添付ファイル: ネイティブ Spring トランザクションはサポートされていません。

  15. ローカルのマルチデータ ソース トランザクション ソリューションを提供します。添付ファイル: ネイティブ Spring トランザクション (3.3.1) はサポートされていません。

この記事では、主に読み取りと書き込みの分離と、1 つのマスター、複数のスレーブ環境を実装します。

  • メイン データベースでは、INSERT、UPDATE、および DELETE 操作のみを実行することをお勧めします。

  • データベースからの SELECT 操作のみを実行することをお勧めします。

1. データベースの準備

メイン データベース: PiaoDB

SpringBoot中如何使用Dynamic Datasource配置多数据源

##スレーブ データベース 1: PiaoDB2

SpringBoot中如何使用Dynamic Datasource配置多数据源

スレーブ データベース 2: PiaoDB3

SpringBoot中如何使用Dynamic Datasource配置多数据源

2. POM ファイルをインポート

dynamic-datasource-spring-boot-starter の紹介。

<!-- 多数据源 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>
ログイン後にコピー

3. 設定ファイルを編集します

マスター ライブラリと 2 つのスレーブ ライブラリを設定しました。

  • 設定ファイル内のアンダースコア _ で区切られたすべてのデータ ソースの「ヘッダー」はグループの名前です。同じグループ名のデータ ソースは 1 つのグループの下に配置されます。グループ。

  • デフォルトのデータ ソース名は 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
ログイン後にコピー
1 つのマスターと複数のスレーブを構成することに加えて、それを構成することもできます。

# 多主多从                      纯粹多库(记得设置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();
    }

}
ログイン後にコピー

2. サービスの書き込み

public interface DemoService {

    boolean add(GoodsInfo param);

    List<GoodsInfo> selectGoodsInfo();

    List<GoodsInfo> selectMasterGoodsInfo();

}
ログイン後にコピー
@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();
    }

}
ログイン後にコピー

3. マッパーの書き込み

@Mapper
public interface DemoMapper {

    boolean insertGoodsInfo(GoodsInfo param);

    List<GoodsInfo> selectGoodsInfo();

}
ログイン後にコピー
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demo.mapper.DemoMapper">

    <select id="selectGoodsInfo" resultType="com.example.demo.entity.GoodsInfo">
        select * from t_goods_info
    </select>

    <insert id="insertGoodsInfo">
        insert into t_goods_info (gname, gnum, gcreatetime)
            values (#{gname}, #{gnum}, now());
    </insert>

</mapper>
ログイン後にコピー

5. 検証結果

1. 新しいインターフェースの追加リクエスト (メインデータベースにデータを追加): 127.0.0.1:8086/demo/add

2. クエリリクエストメイン データベース データ インターフェイス: 127.0.0.1:8086/demo/selectMasterGoodsInfo

SpringBoot中如何使用Dynamic Datasource配置多数据源3. スレーブ データ インターフェイス (負荷分散) のリクエスト:

最初のリクエスト: # ##############二つ目の要求: ############

以上がSpringBoot で動的データソースを使用して複数のデータソースを構成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!