日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Springboot整合多數據源代碼示例詳解

瀏覽:24日期:2023-05-03 16:35:52

最近有個老項目想逐步將新業務的數據放到新的數據庫,以前的業務還得連接以前的數據庫,于是需要整合多數據源 。

多數據源實際上是繼承了AbstractRoutingDataSource類,這個類最終實現了DataSource接口,DataSource里只有一個getConnection方法,數據庫每次訪問的時候都要先通過這個方法獲取連接,所有多數據源就是每次訪問數據庫之前動態的改變數據源。

在請求前改變數據源當然需要用到SpringAOP,自定義注解操作

項目結構

Springboot整合多數據源代碼示例詳解

下面上代碼:

首先是依賴:

<!--數據庫連接--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--sqlserver--> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.2</version> </dependency> <!--數據庫連接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.8</version> </dependency><!--AOP--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>

yml配置數據源

server: port: 8888spring: jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss datasource: druid: first: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource jdbc-url: jdbc:mysql://rm-uf6265pj340sc9447oo.mysql.rds.54565.com:3306/dm?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=utf-8 username: username password: password second: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc-url: jdbc:sqlserver://39.104.203.222:1433;DatabaseName=TestTLcom username: root password: 123456mybatis-plus: mapper-locations: classpath*:/mapper/*Mapper.xml type-aliases-package: com.zdyl.dynamicdatasourcedemo.entity global-config: #主鍵類型 0:'數據庫ID自增', 1:'用戶輸入ID',2:'全局唯一ID (數字類型唯一ID)', 3:'全局唯一ID UUID'; id-type: 3 #字段策略 0:'忽略判斷',1:'非 NULL 判斷'),2:'非空判斷' field-strategy: 2 #駝峰下劃線轉換 db-column-underline: true #刷新mapper 調試神器 refresh-mapper: true #數據庫大寫下劃線轉換 #capital-mode: true #序列接口實現類配置 #key-generator: com.baomidou.springboot.xxx #邏輯刪除配置 #logic-delete-value: 0 #logic-not-delete-value: 1 #自定義填充策略接口實現 #meta-object-handler: com.baomidou.springboot.xxx #自定義SQL注入器 #sql-injector: com.baomidou.springboot.xxx configuration: map-underscore-to-camel-case: true cache-enabled: false

定義數據庫名稱

/** * 數據庫名稱 */public interface DataSourceNames { String FIRST = 'first'; String SECOND = 'second';}

動態數據源

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource;import java.util.HashMap;import java.util.Map;/** * 動態數據源 */public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public DynamicDataSource(DataSource defaultTargetDataSource, Map<String, DataSource> targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(new HashMap<>(targetDataSources)); super.afterPropertiesSet(); } @Override protected Object determineCurrentLookupKey() { return getDataSource(); } public static String getDataSource() { return contextHolder.get(); } public static void setDataSource(String dataSource) { contextHolder.set(dataSource); } public static void clearDataSource() { contextHolder.remove(); }}

配置多數據源

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.DataSourceNames;import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.DynamicDataSource;import org.mybatis.spring.annotation.MapperScan;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 javax.sql.DataSource;import java.util.HashMap;import java.util.Map;/** * 多數據源配置 */@Configuration@MapperScan('com.zdyl.dynamicdatasourcedemo.**.mapper*')public class MybatisPluConfig { /** * 數據源配置 * @return */ @Bean @ConfigurationProperties(prefix='spring.datasource.druid.first') public DataSource firstDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix='spring.datasource.druid.second') public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } @Bean @Primary public DynamicDataSource dataSource(DataSource firstDataSource, DataSource secondDataSource){ Map<String, DataSource> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceNames.FIRST, firstDataSource); targetDataSources.put(DataSourceNames.SECOND, secondDataSource); return new DynamicDataSource(firstDataSource, targetDataSources); } /** * mybatis-plus分頁插件<br> * 文檔:http://mp.baomidou.com<br> */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }}

下面就是自定義注解

import java.lang.annotation.*;/** * 多數據源注解 * AOP攔截此注解更換數據源 */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface CurDataSource { String name() default '';}

AOP

import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.DataSourceNames;import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.DynamicDataSource;import com.zdyl.dynamicdatasourcedemo.dynamicdatasource.annotation.CurDataSource;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.core.Ordered;import org.springframework.stereotype.Component;import java.lang.reflect.Method;/** * 多數據源,切面處理類 * AOP攔截多數據源注解 @CurDataSource 注解更換數據源 */@Slf4j@Aspect@Componentpublic class DataSourceAspect implements Ordered { /** * 切點 */ @Pointcut('@annotation(com.zdyl.dynamicdatasourcedemo.dynamicdatasource.annotation.CurDataSource)') public void dataSourcePointCut() { } @Around('dataSourcePointCut()') public Object around(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); CurDataSource curDataSource = method.getAnnotation(CurDataSource.class); if (curDataSource == null) { DynamicDataSource.setDataSource(DataSourceNames.FIRST); log.info('set datasource is ' + DataSourceNames.FIRST); } else { DynamicDataSource.setDataSource(curDataSource.name()); log.info('set datasource is ' + curDataSource.name()); } try { return point.proceed(); } finally { DynamicDataSource.clearDataSource(); log.info('clean datasource'); } } @Override public int getOrder() { return 1; }}

最后主啟動了去掉數據源自動加載

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

最后我們來跑起來請求一下,測試一下是否正確

@RestControllerpublic class CfgDeviceController { @Resource CfgDeviceService cfgDeviceService; @Resource CfgChargeStartInfoService cfgChargeStartInfoService; @CurDataSource(name = DataSourceNames.FIRST) @GetMapping('/test') public void getUser() { CfgDevice byId = cfgDeviceService.getById(19); System.out.println(byId.toString()); } @CurDataSource(name = DataSourceNames.SECOND) @GetMapping('/test1') public void getUser1() { CfgChargeStartInfo byId = cfgChargeStartInfoService.getById(1); System.out.println(byId.toString()); }}

Springboot整合多數據源代碼示例詳解

**如果不加注解,使用默認數據源

至此就整合完了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
sm久久捆绑调教精品一区| 热三久草你在线| 亚洲伊人影院| 日本精品久久| 欧美精品中文字幕亚洲专区| 国产精品久久| 日韩欧美自拍| 另类av一区二区| 国产一精品一av一免费爽爽| 国产一区二区三区四区| 日韩精品水蜜桃| 亚洲一区二区三区免费在线观看 | 久久99精品久久久野外观看| 欧美aⅴ一区二区三区视频| 欧洲av不卡| 日韩视频久久| 日韩高清电影免费| 日韩在线综合| 日韩精品视频一区二区三区| 不卡专区在线| 视频一区视频二区中文字幕| 国产亚洲欧美日韩在线观看一区二区 | 国产高清亚洲| 亚洲精品乱码| 久久爱www.| 久久国产免费| 日韩欧美美女在线观看| 国产美女高潮在线| 石原莉奈在线亚洲三区| 国产精品一区二区av日韩在线| 黑森林国产精品av| 亚洲国产一区二区三区在线播放| 日韩精品欧美成人高清一区二区| 福利一区二区免费视频| 免费人成网站在线观看欧美高清| 久久99久久久精品欧美| 亚洲国产一区二区在线观看 | 粉嫩av一区二区三区四区五区 | 久久影视三级福利片| 999精品在线| 国产精品久久| 激情综合激情| 福利视频一区| 婷婷精品在线观看| 精品国产亚洲一区二区在线观看| 久久麻豆精品| 国产精品红桃| 亚洲深深色噜噜狠狠爱网站| 日韩欧美一区二区三区免费看| 亚洲精品国模| 久久国产电影| 免费精品一区| 亚洲精品在线二区| 久久精品卡一| 国产精区一区二区| 亚洲欧美日韩国产综合精品二区| 日韩一区二区三免费高清在线观看| 精品免费av在线| 欧美国产极品| 天堂久久一区| 亚洲一区激情| 成人免费电影网址| 精品视频网站| 国产剧情一区二区在线观看| 午夜一级久久| 视频福利一区| 国产一区二区三区黄网站| 久久精品超碰| 日韩午夜免费| 日韩久久电影| 国产精品草草| 一区二区电影| 欧美色图一区| 日韩精品专区| 日本一二区不卡| 久久精品国内一区二区三区| 欧美一区二区三区久久| 综合精品一区| 亚洲神马久久| 婷婷精品进入| 精品一区毛片| 九九在线精品| 久久久久久久久久久妇女 | 欧美日韩亚洲一区二区三区在线| 免费视频久久| 日韩亚洲国产欧美| 欧美特黄一区| 国产综合婷婷| jiujiure精品视频播放| 国内激情久久| 国产精品日韩| 在线看片日韩| 亚洲精选91| 日韩不卡在线观看日韩不卡视频| 亚洲欧洲日韩精品在线| 日本一区中文字幕| 久久国内精品视频| 久久伊人国产| 亚洲日本网址| 欧美+日本+国产+在线a∨观看| 国产 日韩 欧美 综合 一区| 国产欧美在线观看免费| 成人久久一区| 蜜臀国产一区| 亚洲夜间福利| 亚洲一区二区三区高清| 蜜桃伊人久久| 日韩高清不卡一区| 美女性感视频久久| 日韩国产一区二区三区| 国产综合亚洲精品一区二| 最新亚洲一区| 日韩高清电影免费| 另类欧美日韩国产在线| 久久久久久久欧美精品| 蜜桃久久av一区| 91大神在线观看线路一区| 国产丝袜一区| 成人一二三区| 亚洲网站视频| 中文视频一区| 免费亚洲婷婷| 激情久久久久久久| 日韩中文字幕1| 国产精区一区二区| 欧美三区四区| 亚洲精品乱码| 精品高清久久| 国产模特精品视频久久久久| 日韩av网站在线观看| 精品国产免费人成网站| 亚洲专区一区| 欧美激情综合| 日韩午夜精品| 欧美黑人巨大videos精品| 国产综合婷婷| 国产欧美一区二区三区米奇| 日韩国产专区| 欧美资源在线| 精品久久网站| 喷白浆一区二区| 精品久久免费| 亚洲免费观看| 久久99精品久久久野外观看| 欧美亚洲国产激情| 国产欧美日韩亚洲一区二区三区| 日韩大片在线观看| 日韩av影院| 五月天久久网站| 久久丁香四色| 久久高清免费观看| 精品一区电影| 在线观看一区| 日韩一区二区三区免费| 日韩国产在线观看一区| 久久久久国产| 国产精品一线| 免播放器亚洲| 日韩在线短视频| 久久超碰99| 美女91精品| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲综合激情在线| 亲子伦视频一区二区三区| 美国三级日本三级久久99| 日韩电影二区| 欧美激情视频一区二区三区在线播放| 欧美+亚洲+精品+三区| 国产欧美成人| 亚洲婷婷丁香| 国产91久久精品一区二区| 日韩精品成人在线观看| 91久久亚洲| 老鸭窝一区二区久久精品| 日韩专区在线视频| 香蕉人人精品| 国产+成+人+亚洲欧洲在线| 91福利精品在线观看| 美女日韩在线中文字幕| 日韩精品免费一区二区三区| 久久只有精品| 欧美精品影院| 爽好多水快深点欧美视频| 欧美 日韩 国产一区二区在线视频| 国产一区二区三区黄网站| 久久国内精品视频| 蜜臀va亚洲va欧美va天堂| 亚洲激情黄色| 夜鲁夜鲁夜鲁视频在线播放| 国产麻豆精品| 欧美在线看片| 911亚洲精品| 日本午夜免费一区二区| 久久亚洲美女| 亚洲欧美日韩一区在线观看| 日韩视频在线一区二区三区 | 国产成人精品亚洲线观看 | 国产一区二区三区四区五区| 国产欧美日韩一级| 青草综合视频|