機能的特徴:
さまざまなシナリオに適したデータ ソースのグループ化、純粋なマルチデータベース、読み取りと書き込みの分離、1 つのマスター、複数のデータ ソースのグループ化をサポートスレーブ、混合モード。
データ ソースなしの起動をサポートし、遅延起動データ ソースの構成をサポートします (3.3.2)。
データベースの機密構成情報の暗号化 ENC() をサポートします。
各データベースのテーブル構造スキーマとデータベース データベースの独立した初期化をサポートします。
カスタム アノテーションをサポートし、DS (3.2.0) を継承する必要があります。
Druid、Mybatis-Plus、P6sy、Jndi の高速統合を提供します。
Druid と HikariCp の構成を簡素化し、グローバル パラメーター構成を提供します。一度設定すれば、それをグローバルに使用できます。
カスタム データ ソース ソリューションを提供します。
プロジェクトの開始後にデータ ソースを動的に追加および削除するためのソリューションを提供します。
Mybatis 環境で純粋な読み取り/書き込み分離ソリューションを提供します。
SpEL 動的パラメーターを使用して、データ ソース スキームを解析するメソッドを提供します。組み込みのスペル、セッション、ヘッダー、サポートのカスタマイズ。
マルチレイヤー データ ソースのネストされた切り替えをサポートします。 (サービス A >>> サービス B >>> サービス C)。
hiro、sharding-jdbc、quartz などのサードパーティ ライブラリを統合するためのソリューション、注意事項、および例を提供します。
Seata に基づいた分散トランザクション ソリューションを提供します。添付ファイル: ネイティブ Spring トランザクションはサポートされていません。
ローカルのマルチデータ ソース トランザクション ソリューションを提供します。添付ファイル: ネイティブ Spring トランザクション (3.3.1) はサポートされていません。
この記事では、主に読み取りと書き込みの分離と、1 つのマスター、複数のスレーブ環境を実装します。
メイン データベースでは、INSERT、UPDATE、および DELETE 操作のみを実行することをお勧めします。
データベースからの SELECT 操作のみを実行することをお勧めします。
1. データベースの準備
メイン データベース: PiaoDB
##スレーブ データベース 1: PiaoDB2 スレーブ データベース 2: PiaoDB32. 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 つのスレーブ ライブラリを設定しました。Alibaba データベース接続プール Druid を使用しているため、ネイティブ Druid クイック構成クラスを除外する必要があります。 その他のサードパーティ統合アドレス: Druid 統合
- 設定ファイル内のアンダースコア _ で区切られたすべてのデータ ソースの「ヘッダー」はグループの名前です。同じグループ名のデータ ソースは 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ログイン後にコピー
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
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 はメソッドとクラスにアノテーションを付けることができます。両方が存在する場合、メソッド アノテーションがクラス アノテーションより優先されます。サービス実装またはマッパー インターフェイス メソッドにアノテーションを付けることを強くお勧めします。1. コントローラーの書き込み
- @DS("xxx") はデータ ソース xxx を指定します。xxx はグループ名または特定のライブラリの名前です。グループ名の場合、切り替え時に負荷分散アルゴリズムが使用されます。指定したグループ名またはライブラリが存在しない場合は、デフォルトのデータ ソース (メイン ライブラリ) が自動的に使用されます。
- #@DS がない場合は、デフォルトのデータ ソース (メイン ライブラリ)
- @DS が設定されているが、グループまたはライブラリが指定されていない場合は、DynamicDataSourceStrategy 戦略に基づいてスレーブ ライブラリが選択されます。デフォルトの負荷分散ポリシー。
@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>
1. 新しいインターフェースの追加リクエスト (メインデータベースにデータを追加): 127.0.0.1:8086/demo/add
2. クエリリクエストメイン データベース データ インターフェイス: 127.0.0.1:8086/demo/selectMasterGoodsInfo
3. スレーブ データ インターフェイス (負荷分散) のリクエスト:
最初のリクエスト: # ##############二つ目の要求: ############
以上がSpringBoot で動的データソースを使用して複数のデータソースを構成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。