はじめに:このコンテンツは、主にmybatis-plusの公式文書に従って実装されています。公式ウェブサイトアドレス:https://mp.baomidou.com
利点
インターネット上の動的データソースの切り替えに関するドキュメントは多数あり、コアは2つしかありません。
- 複数の環境を構築する場合の利点は、制御が便利で、いくつかの単純な分散トランザクションを簡単に統合できることです。欠点は、動的ではなく、大量のコードがあり、構成が難しいことです。
- ネイティブを提供するための春に基づいて
AbstractRoutingDataSource
、スイッチを実装するためにいくつかのドキュメントを参照してください。
データソースが少なく、シーンが複雑でない場合は、上記のいずれかを選択できます。より多くの機能が必要な場合は、この動的データソースを試してください。
- 複数のシナリオに適したデータソースのグループ化、純粋なマルチデータベースの読み取りと書き込みの分離、マスターとマルチスレーブの混合モード。
- 複数のデータソースを監視するためのDruidデータソースの単純な統合、単一のテーブルを単純化するためのMybatis-Plusの単純な統合、P6sy形式のsqlの単純な統合、およびJndiデータソースの単純な統合。
- DruidとHikariCpの構成を簡素化し、グローバルパラメーター構成を提供します。
- カスタムデータソースソースを提供します(デフォルトではymlまたはプロパティ構成が使用されます)。
- プロジェクトの開始後、データソースを動的に増減できます。
- セッション、ヘッダー、パラメーターからデータソースを取得するなど、spel動的パラメーターを使用してデータソースを解析します。(マルチテナントアーキテクチャアーティファクト)
- マルチレベルのデータソースネスティングスイッチング。(ビジネスServiceAはServiceBを呼び出し、ServiceBはServiceCを呼び出し、各サービスは異なるデータソースです)
- 通常のマッチングまたはspel式を使用して、データソースを切り替えます(実験的機能)。
#デメリット
マルチデータソーストランザクションは使用できず(トランザクションは同じデータソースで使用できます)、インターネット上の他のプログラムを提供することはできません。
分散トランザクションを使用する必要がある場合、アーキテクチャはマイクロサービスの時点である必要があります。
呼びかけが強く、プロジェクトが800つ星に達した場合、作成者は分散トランザクションの統合を検討します。
PS:データベースが少ないが、分散トランザクションの必要性が高い場合は、従来の方法を使用して複数の環境を構築し、アトミックを統合することをお勧めします。多くのオンラインBaidusがあります。
#コンベンション
- このフレームワークは、データソースを切り替えるだけで 、特定の操作を制限する ことはありません。データソースを切り替えると、任意のCRUDを実行できます。
- 構成ファイルで下線で
_
区切られたすべてのデータソース の ヘッダーは グループの名前であり、同じグループ名のデータソースは1つのグループの下に配置されます。 - データソースの切り替えは、グループ名または特定のデータソース名のいずれかになります。切り替え時には、デフォルトで負荷分散メカニズムが使用されます。
- デフォルトのデータソース名は master です。これは、spring.datasource.dynamic.primaryを介して変更できます。
- メソッドの注釈は、クラスの注釈よりも優先されます。
#提案
他の人があなたのコードをより簡単に理解できるように、マスタースレーブモードの一般的なルールに従うことを強くお勧め します。
メインデータベースで は 、INSERT
UPDATE
DELETE
操作の実行のみを推奨してい ます。
データベースからの 操作 のみを実行する ことをお勧めします SELECT
。
#使い方
依存関係を導入します。
<properties>
<java.version>1.8</java.version>
<mybatis-plus.version>3.0.5</mybatis-plus.version>
<velocity.version>2.0</velocity.version>
</properties>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity.version}</version>
</dependency>
<!--开发者工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!--mybatis-plus 持久层-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!--添加tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
主にこの依存関係:dynamic-datasource-spring-boot-starter <
次に、私の構成ファイルを見てください。複数のマスターと複数のスレーブ、または純粋に複数のライブラリ、混合構成を構成する場合は、公式Webサイト構成を参照できます:https://mp.baomidou.com/guide/dynamic-datasource.html
# 服务端口
server.port=8099
# 服务名
spring.application.name=test
# 环境设置:dev、test、prod
spring.profiles.active=dev
# mysql数据库连接
spring.datasource.dynamic.primary=mysql
spring.datasource.dynamic.datasource.mysql.username=root
spring.datasource.dynamic.datasource.mysql.password=xxx
spring.datasource.dynamic.datasource.mysql.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.mysql.url=jdbc:mysql://122.51.97.164:3306/jk?useSSL=false&serverTimezone=UTC
spring.datasource.dynamic.datasource.slave_1.username=root
spring.datasource.dynamic.datasource.slave_1.password=xxxx
spring.datasource.dynamic.datasource.slave_1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.dynamic.datasource.slave_1.url=jdbc:mysql://127.0.0.1:3306/travel?useSSL=false&serverTimezone=UTC
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#spring.jackson.time-zone=GMT+8
次に、私のデータテーブルを見てみましょう。私のデータテーブルは非常に単純で、2つの非常に単純なテーブルだけです。
これらの2つのテーブル
これら2つのエンティティクラスのコードを以下に貼り付けます
public class Ss {
Integer id;
String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Ss{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public class Tt {
Integer id;
String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Tt{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
2つのマッパーコードもあります
public interface SsMapper extends BaseMapper<Ss> {
}
public interface TtMapper extends BaseMapper<Tt> {
}
次に、2つのサービスのコードがあり、内部のメソッドは単にすべてのクエリです。
public interface SsService extends IService<Ss> {
List<Ss> info();
}
public interface TtService extends IService<Tt> {
List<Tt> info();
}
2つのimplコード
@Service
@DS("mysql")
public class SsServiceImpl extends ServiceImpl<SsMapper, Ss> implements SsService {
@Autowired
private SsMapper ssMapper;
@Override
public List<Ss> info() {
List<Ss> sses = ssMapper.selectList(null);
return sses;
}
}
@Service
@DS("slave_1")
public class TtServiceImpl extends ServiceImpl<TtMapper, Tt> implements TtService {
@Autowired
private TtMapper ttMapper;
@Override
public List<Tt> info() {
List<Tt> tts = ttMapper.selectList(null);
return tts;
}
}
ここでは、主に@DSアノテーションを使用して動的データソースを実現します。
以下は公式サイトからコピーしたものです
使用 @DS 切换数据源。
@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。
注解在service实现或mapper接口方法上,但强烈不建议同时在service和mapper注解。 (可能会有问题)
注解 结果
没有@DS 默认数据源
@DS("dsName") dsName可以为组名也可以为具体某个库的名称
@DSの構成ファイルに独自のデータベースを書き込むことです。私の実装に注釈を追加するのと同じように、構成ファイルで多くのデータソースを構成できます。
わかりました!この時点で、動的データソースの構成を実装するだけでも、次にテストしましょう。
私は2つのテスト方法を書きました
@Test
public void contextLoads() {
List<Tt> info = ttService.info();
System.out.println(info);
}
@Test
public void contextLoad() {
List<Ss> info = ssService.info();
System.out.println(info);
}
最初のテストメソッドを実行します
2番目のテスト方法をテストします。
動的データソースを実現するための従来のaopと比較して、動的データソースを実現することは非常に簡単ですか?
このようにして、複数のデータベースクエリデータを実現し、単に動的データソースを実現しました。ここでは、mybatis-plusの開発者に、このような優れた開発ツールを提供してくれたことに感謝します。これは、開発における多くの面倒な問題を解決するのに本当に役立ちました。
ご不明な点がございましたら、メッセージを残してください。
関連するコードはgithubにあります:https://github.com/Wujungang/more-datasources.git