日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Springboot设置多数据源,随时切换

發布時間:2023/12/8 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Springboot设置多数据源,随时切换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需求:

接到一個任務,把一個數據庫里面的數據導入到另外的數據庫中,但是又不允許我們通過binlog+cannl同步,所以考慮起一個微服務充當同步腳本的作用,且配置多數據庫,并且支持隨時切換。

環境:

1、mysql多個庫
2、mysql+postgresql

思路:

spring框架本身支持多數據源,我們查看他的定義

Spring的多數據源支持—AbstractRoutingDataSource,AbstractRoutingDataSource定義了抽象的determineCurrentLookupKey方法,子類實現此方法,來確定要使用的數據源

public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {protected DataSource determineTargetDataSource() {Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");Object lookupKey = determineCurrentLookupKey();DataSource dataSource = this.resolvedDataSources.get(lookupKey);if (dataSource == null && (this.lenientFallback || lookupKey == null)) {dataSource = this.resolvedDefaultDataSource;}if (dataSource == null) {throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");}return dataSource;}// 確定當前要使用的數據源protected abstract Object determineCurrentLookupKey(); }

所以我們只要寫一個自定義類去繼承AbstractRoutingDataSource,并重寫determineCurrentLookupKey 方法即可

操作:

包如下:

一、多個庫都是mysql類型

pom依賴:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.7</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>db-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>db-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

1、配置文件application.yml

#端口 server.port: 7788 spring.application.name: bddemo# mysql spring.datasource:driver-class-name: com.mysql.cj.jdbc.Driver#數據庫1db1:jdbc-url: jdbc:mysql://127.0.0.1:3306/db1?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456#數據庫2db2:jdbc-url: jdbc:mysql://127.0.0.1:3306/db2?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456# mybatis mybatis:mapper-locations: classpath:mapper/*Mapper.xmltype-aliases-package: ccom.example.demo.*.entity

2、 配置類:

1) DataSourceConfig 數據庫配置類:

import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; /** * 數據庫配置 * @date 2022/5/19 */ @Configuration public class DataSourceConfig {/*** 數據源1* spring.datasource.db1:application.properteis中對應屬性的前綴* @return*/@Bean(name = "db1")@ConfigurationProperties(prefix = "spring.datasource.db1")public DataSource dataSourceOne() {return DataSourceBuilder.create().build();}/*** 數據源2* spring.datasource.db2:application.properteis中對應屬性的前綴* @return*/@Bean(name = "db2")@ConfigurationProperties(prefix = "spring.datasource.db2")public DataSource dataSourceTwo() {return DataSourceBuilder.create().build();}/*** 動態數據源: 通過AOP在不同數據源之間動態切換* @return*/@Primary@Bean(name = "dynamicDataSource")public DataSource dynamicDataSource() {DynamicDataSource dynamicDataSource = new DynamicDataSource();// 默認數據源dynamicDataSource.setDefaultTargetDataSource(dataSourceOne());// 配置多數據源Map<Object, Object> dsMap = new HashMap<>();dsMap.put("db1", dataSourceOne());dsMap.put("db2", dataSourceTwo());dynamicDataSource.setTargetDataSources(dsMap);return dynamicDataSource;}/*** 配置多數據源后IOC中存在多個數據源了,事務管理器需要重新配置,不然器不知道選擇哪個數據源* 事務管理器此時管理的數據源將是動態數據源dynamicDataSource* 配置@Transactional注解* @return*/@Beanpublic PlatformTransactionManager transactionManager() {return new DataSourceTransactionManager(dynamicDataSource());} }

2) DynamicDataSource 動態數據源類:

import com.example.demo.utils.DataSourceUtil; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /*** 動態數據源類* @date 2022/2/11*/ public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceUtil.getDB();} }

3、切換工具類:DataSourceUtil

/** * 數據源切換工具* @date 2022/5/19 */ public class DataSourceUtil {/*** 默認數據源*/public static final String DEFAULT_DS = "db1";/*** 數據源屬于一個公共的資源* 采用ThreadLocal可以保證在多線程情況下線程隔離*/private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();/*** 設置數據源名* @param dbType*/public static void setDB(String dbType) {contextHolder.set(dbType);}/*** 獲取數據源名* @return*/public static String getDB() {return (contextHolder.get());}/*** 清除數據源名*/public static void clearDB() {contextHolder.remove();} }

4、 啟動:

(1)啟動類中配置移除默認的數據庫配置類

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;//移除默認數據庫配置類 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class DbDemoApplication {public static void main(String[] args) {SpringApplication.run(DbDemoApplication.class, args);}}

(2)測試

結果
db1庫

db2庫


二、一個是mysql一個是postgresql

1、pom依賴新增:

<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><scope>runtime</scope></dependency>

2、配置文件application.yml

#端口 server.port: 7788 spring.application.name: bddemo# mysql spring.datasource:#數據庫1db1:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/db1?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456#數據庫2db2: # driver-class-name: com.mysql.cj.jdbc.Driver # jdbc-url: jdbc:mysql://127.0.0.1:3306/db2?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false # username: root # password: 123456driver-class-name: org.postgresql.Driverjdbc-url: jdbc:postgresql://127.0.0.1:5432/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=falseusername: postgrespassword: 123456# mybatis mybatis:mapper-locations: classpath:mapper/*Mapper.xmltype-aliases-package: ccom.example.demo.*.entity

注意:

之前都是mysql的庫,所以驅動在上面

現在因為數據庫的產品不一樣,所以驅動類名稱放在下面單獨配置(有些人真完全不會變通,哎)

3、測試:

插入:pg數據庫的主鍵自增mybatis還有點難搞,我們直接配置id插入

mysql:

pg:

查詢:

總結

以上是生活随笔為你收集整理的Springboot设置多数据源,随时切换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。