mybatis-flex實(shí)現(xiàn)多數(shù)據(jù)源操作
多數(shù)據(jù)源?
MyBaits-Flex 內(nèi)置了功能完善的多數(shù)據(jù)源支持^1.0.6,不需要借助第三方插件或者依賴(lài),開(kāi)箱即用, 支持包括 druid、hikaricp、dbcp2、beecp 在內(nèi)的任何數(shù)據(jù)源,MyBatis-Flex 多數(shù)據(jù)源配置如下:
mybatis-flex:
datasource:
ds1:
url: jdbc:mysql://127.0.0.1:3306/db
username: root
password: 123456
ds2:
url: jdbc:mysql://127.0.0.1:3306/db2
username: root
password: 123456在以上配置中,ds1 和 ds2 是由用戶自定義的,我們可以理解為數(shù)據(jù)源的名稱(chēng),或者數(shù)據(jù)源的 key,這個(gè)在動(dòng)態(tài)切換數(shù)據(jù)庫(kù)中非常有用。
在無(wú) Spring 框架的場(chǎng)景下,代碼如下:
DataSource dataSource1 = new HikariDataSource();
dataSource1.setJdbcUrl(....)
DataSource dataSource2 = new HikariDataSource();
dataSource2.setJdbcUrl(....)
DataSource dataSource3 = new HikariDataSource();
dataSource3.setJdbcUrl(....)
MybatisFlexBootstrap.getInstance()
.setDataSource("ds1", dataSource1)
.addDataSource("ds2", dataSource2)
.addDataSource("ds3", dataSource3)
.start();開(kāi)始使用?
默認(rèn)使用第一個(gè)配置的數(shù)據(jù)源:
List<Row> rows = Db.selectAll("tb_account");
System.out.println(rows);通過(guò)編碼的方式,切換到數(shù)據(jù)源 ds2:
try{
DataSourceKey.use("ds2")
List<Row> rows = Db.selectAll("tb_account");
System.out.println(rows);
}finally{
DataSourceKey.clear();
}或者
List<Row> rows = DataSourceKey.use("ds2"
, () -> Db.selectAll("tb_account"));數(shù)據(jù)源切換(設(shè)置)?
MyBatis-Flex 提供了 4 種方式來(lái)配置數(shù)據(jù)源:
- 1、編碼,使用
DataSourceKey.use方法。 - 2、
@UseDataSource("dataSourceName")在 Mapper 類(lèi)上,添加注解,用于指定使用哪個(gè)數(shù)據(jù)源。 - 3、
@UseDataSource("dataSourceName")在 Mapper 方法上,添加注解,用于指定使用哪個(gè)數(shù)據(jù)源。 - 4、
@Table(dataSource="dataSourceName")在 Entity 類(lèi)上添加注解,該 Entity 的增刪改查請(qǐng)求默認(rèn)使用該數(shù)據(jù)源。
在 SpringBoot 項(xiàng)目上,
@UseDataSource("dataSourceName")也可用于在 Controller 或者 Service 上。若是 Spring 項(xiàng)目(非 SpringBoot), 用戶需要參考MultiDataSourceAutoConfiguration進(jìn)行配置后才能使用。
DataSourceKey.use 示例:
try{
DataSourceKey.use("ds2")
List<Row> rows = Db.selectAll("tb_account");
System.out.println(rows);
}finally{
DataSourceKey.clear();
}@UseDataSource("dataSourceName") 示例:
@UseDataSource("ds2")
interface AccountMapper extends BaseMapper{
List<Account> myMethod();
}或者
interface AccountMapper extends BaseMapper{
@UseDataSource("ds2")
List<Account> myMethod();
}@Table(dataSource="dataSourceName") 示例:
@Table(value = "tb_account", dataSource = "ds2")
public class Account {
@Id(keyType = KeyType.Auto)
private Long id;
private String userName;
}數(shù)據(jù)源配置的優(yōu)先級(jí)
DataSourceKey.use() > @UseDataSource()在方法上 > @UseDataSource()在類(lèi)上 >@Table(dataSource="...")
更多的 Spring Yaml 配置支持?
mybatis-flex:
datasource:
ds1:
url: jdbc:mysql://127.0.0.1:3306/db
username: root
password: 123456
ds2:
url: jdbc:mysql://127.0.0.1:3306/db2
username: root
password: 123456在以上配置中,ds1 和 ds2 并未指定使用哪個(gè)數(shù)據(jù)連接池,MyBatis-Flex 會(huì) 自動(dòng)探測(cè) 當(dāng)前項(xiàng)目依賴(lài)了哪個(gè)連接池。 目前支持了 druid、hikaricp、dbcp2、beecp 的自動(dòng)探測(cè),如果項(xiàng)目中使用的不是這 4 種類(lèi)型只有,需要添加 type 配置,如下所示:
mybatis-flex:
datasource:
ds1:
type: com.your.datasource.type1
url: jdbc:mysql://127.0.0.1:3306/db
username: root
password: 123456
ds2:
type: com.your.datasource.type2
url: jdbc:mysql://127.0.0.1:3306/db2
username: root
password: 123456同時(shí),項(xiàng)目若使用到了多個(gè)數(shù)據(jù)源類(lèi)型,則也需要添加 type 來(lái)指定當(dāng)前數(shù)據(jù)源的類(lèi)型。
除了 type、url、username、password 的配置以外,MyBatis-Flex 支持該 DataSource 類(lèi)型的所有參數(shù)配置, 例如,在 DruidDataSource 類(lèi)中存在 setAsyncInit 方法,我們就可以添加 asyncInit 的配置,如下所示:
mybatis-flex:
datasource:
ds1:
type: druid
url: jdbc:mysql://127.0.0.1:3306/db
username: root
password: 123456
asyncInit: true
ds2:
type: com.your.datasource.type2
url: jdbc:mysql://127.0.0.1:3306/db2
username: root
password: 123456因此,只要該 DataSource 有 setter 方法,我們就可以在配置文件中進(jìn)行配。與此相反的是:若該 DataSource 類(lèi)型沒(méi)有該屬性,則不能使用這個(gè)配置。
提示
在數(shù)據(jù)源的配置中,type 可以配置為某個(gè) DataSource 的類(lèi)名,也可以配置為別名,別名支持有:druid、 hikari、hikaricp、bee、beecp、dbcp、dbcp2。
動(dòng)態(tài)添加新的數(shù)據(jù)源?
在多租戶等某些場(chǎng)景下,我們可能需要用到動(dòng)態(tài)的添加新的數(shù)據(jù)源,此時(shí)可以通過(guò)如下的方式進(jìn)行添加。
FlexDataSource flexDataSource = FlexGlobalConfig.getDefaultConfig()
.getDataSource();
//新的數(shù)據(jù)源
HikariDataSource newDataSource = new HikariDataSource();
flexDataSource.addDataSource("newKey", newDataSource);需要注意的是: 通過(guò) FlexGlobalConfig 去獲取 FlexDataSource 時(shí),需等待應(yīng)用完全啟動(dòng)成功后,才能正常獲取 FlexDataSource, 否則將會(huì)得到 null 值。
Spring 用戶可以通過(guò) ApplicationListener 去監(jiān)聽(tīng) ContextRefreshedEvent 事件,然后再去添加新的數(shù)據(jù)源,如下代碼所示:
public class DataSourceInitListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
FlexDataSource dataSource = FlexGlobalConfig.getDefaultConfig()
.getDataSource();
dataSource.addDataSource("....", new DruidDataSource("..."));
}
}多數(shù)據(jù)源負(fù)載均衡 ^1.5.4?
數(shù)據(jù)源負(fù)載均衡指的是:在進(jìn)行數(shù)據(jù)查詢的時(shí)候,隨機(jī)使用一個(gè)數(shù)據(jù)源。 這是的在高并發(fā)的場(chǎng)景下,起到負(fù)載的效果。
假設(shè)多數(shù)據(jù)源配置如下:
mybatis-flex:
datasource:
ds1:
type: druid
url: jdbc:mysql://127.0.0.1:3306/db
username: root
password: 123456
asyncInit: true
ds2:
type: com.your.datasource.type2
url: jdbc:mysql://127.0.0.1:3306/db2
username: root
password: 123456
other:
type: com.your.datasource.type2
url: jdbc:mysql://127.0.0.1:3306/db2
username: root
password: 123456以上配置了三個(gè)數(shù)據(jù)源,分別為:ds1、ds2、other,假設(shè)我們想負(fù)載均衡使用 ds1、ds2 ,那么代碼如下:
try{
DataSourceKey.use("ds*");
List<Row> rows = Db.selectAll("tb_account");
System.out.println(rows);
}finally{
DataSourceKey.clear();
}DataSourceKey.use("ds*") 中的 ds* 指的是使用 ds 開(kāi)頭的任意一個(gè)數(shù)據(jù)源。ds* 必須以 "*" 結(jié)尾, 中間不能有空格,比如 "ds *" 中間有空格是不行的。
到此這篇關(guān)于mybatis-flex實(shí)現(xiàn)多數(shù)據(jù)源操作的文章就介紹到這了,更多相關(guān)mybatis-flex 多數(shù)據(jù)源操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Flex實(shí)現(xiàn)分頁(yè)查詢的示例代碼
- Mybatis-flex整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例
- Spring Boot整合MyBatis-Flex全過(guò)程
- SpringBoot使用MyBatis-Flex實(shí)現(xiàn)靈活的數(shù)據(jù)庫(kù)訪問(wèn)
- mybatis-flex實(shí)現(xiàn)鏈?zhǔn)讲僮鞯氖纠a
- MyBatis-Flex實(shí)現(xiàn)多表聯(lián)查(自動(dòng)映射)
- Springboot集成Mybatis-Flex的示例詳解
- mybatis-flex與springBoot整合的實(shí)現(xiàn)示例
- MyBatis-Flex 邏輯刪除的用法小結(jié)
相關(guān)文章
SpringBoot使用Thymeleaf自定義標(biāo)簽的實(shí)例代碼
這篇文章主要介紹了SpringBoot使用Thymeleaf自定義標(biāo)簽的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Java中WeakHashMap和HashMap的區(qū)別詳解
這篇文章主要介紹了Java中WeakHashMap和HashMap的區(qū)別詳解,WeakHashMap和HashMap一樣,WeakHashMap也是一個(gè)散列表,它存儲(chǔ)的內(nèi)容也是鍵值對(duì)(key-value)映射,而且鍵和值都可以為null,需要的朋友可以參考下2023-09-09
Java如何實(shí)現(xiàn)通過(guò)鍵盤(pán)輸入一個(gè)數(shù)組
這篇文章主要介紹了Java實(shí)現(xiàn)通過(guò)鍵盤(pán)輸入一個(gè)數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringMVC框架如何與Junit整合看這個(gè)就夠了
這篇文章主要介紹了SpringMVC框架如何與Junit整合看這個(gè)就夠了,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
深入淺析springsecurity入門(mén)登錄授權(quán)
SpringSecurity為我們提供了基于注解的權(quán)限控制方案,這也是我們項(xiàng)目中主要采用的方式,我們可以使用注解去指定訪問(wèn)對(duì)應(yīng)的資源所需的權(quán)限,這篇文章主要介紹了springsecurity入門(mén)登錄授權(quán),需要的朋友可以參考下2024-05-05
java實(shí)現(xiàn)html轉(zhuǎn)pdf方法步驟
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)html轉(zhuǎn)pdf方法的相關(guān)資料,要將HTML轉(zhuǎn)換成PDF,我們需要借助Java中的第三方庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
Java利用HttpClient模擬POST表單操作應(yīng)用及注意事項(xiàng)
本文主要介紹JAVA中利用HttpClient模擬POST表單操作,希望對(duì)大家有所幫助。2016-04-04
java中LinkedBlockingQueue與ArrayBlockingQueue的異同
這篇文章主要介紹了java中LinkedBlockingQueue與ArrayBlockingQueue的異同,需要的朋友可以參考下2016-08-08
解決Maven項(xiàng)目本地公共common包緩存問(wèn)題
這篇文章主要介紹了解決Maven項(xiàng)目本地公共common包緩存問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

