当前位置: 首页 > news >正文

昆山汽车网站建设便捷的网站建设平台

昆山汽车网站建设,便捷的网站建设平台,全球十大跨境电商平台,做网站后台要学前言 本博客姊妹篇 基于SpringBootDruid实现多数据源#xff1a;原生注解式基于SpringBootDruid实现多数据源#xff1a;注解编程式基于SpringBootDruid实现多数据源#xff1a;baomidou多数据源 一、功能描述 配置方式#xff1a;配置文件中实现多数据源#xff0c;非…前言 本博客姊妹篇 基于SpringBootDruid实现多数据源原生注解式基于SpringBootDruid实现多数据源注解编程式基于SpringBootDruid实现多数据源baomidou多数据源 一、功能描述 配置方式配置文件中实现多数据源非动态使用方式使用注解切换数据源 二、代码实现 2.1 配置 # spring配置 spring:# 数据源配置datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:web-stat-filter:enabled: trueurl-pattern: /*exclusions: *.js,*.css,*.gif,*.png,*.jpg,*.ico,/druid/*stat-view-servlet:enabled: trueurl-pattern: /druid/*login-username: adminlogin-password: 123456filter:stat:enabled: truelog-slow-sql: trueslow-sql-millis: 1000merge-sql: truewall:enabled: trueconfig:multi-statement-allow: truemaster:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/boot_business?useUnicodetruecharacterEncodingUTF8serverTimezoneGMT%2B8useSSLfalseusername: rootpassword: rootinitial-size: 10min-idle: 10max-active: 100max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: select 1test-while-idle: truetest-on-borrow: falsetest-on-return: falsepool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20slave:enabled: truedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/boot_codegen?useUnicodetruecharacterEncodingUTF8serverTimezoneGMT%2B8useSSLfalseusername: rootpassword: rootinitial-size: 10min-idle: 10max-active: 100max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: select 1test-while-idle: truetest-on-borrow: falsetest-on-return: falsepool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 202.2 配置类 package com.qiangesoft.datasource.core;import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary;import java.util.HashMap; import java.util.Map;/*** 多数据源配置** author qiangesoft* date 2024-03-14*/ Slf4j Configuration public class DataSourceConfiguration {BeanConfigurationProperties(spring.datasource.druid.master)public DruidDataSource masterDataSource() {DruidDataSource masterDataSource DruidDataSourceBuilder.create().build();masterDataSource.setName(DataSourceType.MASTER.getType());return masterDataSource;}BeanConfigurationProperties(spring.datasource.druid.slave)ConditionalOnProperty(prefix spring.datasource.druid.slave, name enabled, havingValue true)public DruidDataSource slaveDataSource() {DruidDataSource slaveDataSource DruidDataSourceBuilder.create().build();slaveDataSource.setName(DataSourceType.SLAVE.getType());return slaveDataSource;}BeanPrimarypublic DynamicDataSource dynamicDataSource(DruidDataSource masterDataSource, DruidDataSource slaveDataSource) {MapObject, Object targetDataSources new HashMap();targetDataSources.put(masterDataSource.getName(), masterDataSource);targetDataSources.put(slaveDataSource.getName(), slaveDataSource);return new DynamicDataSource(masterDataSource, targetDataSources);} } 2.3 多数据源扩展实现 package com.qiangesoft.datasource.core;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource; import java.util.Map;/*** 动态数据源** author qiangesoft* date 2024-03-14*/ public class DynamicDataSource extends AbstractRoutingDataSource {public DynamicDataSource(DataSource defaultTargetDataSource, MapObject, Object targetDataSources) {super.setDefaultTargetDataSource(defaultTargetDataSource);super.setTargetDataSources(targetDataSources);super.afterPropertiesSet();}Overrideprotected Object determineCurrentLookupKey() {return DataSourceContext.getDataSource();} }2.4 切面 package com.qiangesoft.datasource.core;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.annotation.AnnotationUtils; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;import java.util.Objects;/*** 多数据源处理** author qiangesoft* date 2024-03-14*/ Slf4j Order(1) Aspect Component public class DataSourceAspect {/*** 切点*/Pointcut(annotation(com.qiangesoft.datasource.core.DataSource))public void pointCut() {}/*** 通知** param joinPoint* return* throws Throwable*/Around(pointCut())public Object around(ProceedingJoinPoint joinPoint) throws Throwable {DataSource dataSource this.getDataSource(joinPoint);if (dataSource null) {DataSourceContext.setDataSource(DataSourceType.MASTER);} else {DataSourceContext.setDataSource(dataSource.value());}try {return joinPoint.proceed();} finally {DataSourceContext.removeDataSource();}}/*** 获取数据源** param joinPoint* return*/public DataSource getDataSource(ProceedingJoinPoint joinPoint) {MethodSignature signature (MethodSignature) joinPoint.getSignature();// 方法上查找注解DataSource dataSource AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class);if (Objects.nonNull(dataSource)) {return dataSource;}// 类上查找注解return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);} } 2.5 线程本地变量 package com.qiangesoft.datasource.core;/*** 数据源上下文** author qiangesoft* date 2024-03-14*/ public class DataSourceContext {/*** 线程本地变量数据源*/private static final ThreadLocalString CONTEXT_HOLDER new ThreadLocal();/*** 设置数据源的变量*/public static void setDataSource(DataSourceType dataSourceType) {CONTEXT_HOLDER.set(dataSourceType.getType());}/*** 获得数据源的变量*/public static String getDataSource() {return CONTEXT_HOLDER.get();}/*** 清空数据源变量*/public static void removeDataSource() {CONTEXT_HOLDER.remove();} }2.6 使用 package com.qiangesoft.datasource.controller;import com.qiangesoft.datasource.core.DataSource; import com.qiangesoft.datasource.core.DataSourceType; import com.qiangesoft.datasource.entity.SysUser; import com.qiangesoft.datasource.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** p* 用户信息 前端控制器* /p** author qiangesoft* since 2024-03-14*/ RestController RequestMapping(/sys/user) public class SysUserController {Autowiredprivate ISysUserService sysUserService;DataSource(DataSourceType.MASTER)GetMapping(/master)public ListSysUser listMaster() {return sysUserService.list();}DataSource(DataSourceType.SLAVE)GetMapping(/slave)public ListSysUser listSlave() {return sysUserService.list();}}
http://www.zqtcl.cn/news/463443/

相关文章:

  • 做一个交易平台网站的成本深圳南山做网站的公司
  • 网站建设的开发的主要方法aspcms分类信息网站
  • 中国免费图片素材网站烟台电商网站开发
  • 网站框架图浅谈网站的主色调设计
  • asp.net网站iis与目录权限设置做网站前端用什么软件好
  • 网站后台图片模板前端作业做一个网站
  • 做兼职的翻译网站吗教育直播网站开发
  • pxhere素材网站电子商务的网站开发的工作内容
  • 邮件网站怎么做wordpress如何代码高亮
  • 电脑做视频的网站吗中小学 网站建设 通知
  • 给企业做网站赚钱吗吉 360 网站建设
  • 网站建设多少价格东莞网站推广团队
  • 做课件的软件下载带有蓝色的网站html网页制作代码实例
  • 建设银行鄂州分行官方网站健身网站开发方式
  • 大连免费建站模板花坛设计平面图
  • 建设网站对企业有什么好处wordpress教程视频下载
  • 郑州网站提升排名上海 企业 网站建设
  • 南昌好的做网站的公司营销型网站 案例
  • 南宁经典网站建设网络运维工程师是干什么的
  • 网站开发算法建网站难不难
  • 茂名模板建站定制网站开发 ide
  • 做网站现在用什么语言网站估价
  • wap开头的网站外贸网站建设官网
  • 做网站说什么5.0啥意思wordpress教程视频 下载
  • 业务型网站做seo郑州网站推广优化
  • 400网站建设南昌网站建设方案详细版
  • 网站评论回复如何做中国住建部和城乡建设官网
  • 怎么建设网站南京做南京华美整容网站
  • 有哪些可以做1元夺宝的网站推广网站哪家做的好
  • 网站备案 域名不是自己的成都电子商务网站