當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Springboot设置多数据源,随时切换
生活随笔
收集整理的這篇文章主要介紹了
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.*.entity2、 配置類:
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设置多数据源,随时切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv心得体会_OpenCV心得
- 下一篇: gradle idea java ssm