首页 > 其他分享 >springboot多数据源配置

springboot多数据源配置

时间:2024-04-15 11:36:32浏览次数:11  
标签:return springboot DynDatasource 数据源 配置 Module public SQLException class

由于我们系统旧环境没有用springboot自带的多数据源功能,使用了自己配置的多数据源。

添加自定义数据源注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DynDatasource {
Module value() default Module.DEF;
}

注解扫描

public CheckoutDatasourceAspect() {
}

@Around("@within(com.midea.cloud.dynamicds.aop.anno.DynDatasource)")
public Object checkoutDatasource(ProceedingJoinPoint joinPoint) throws Throwable {
Object var5;
try {
MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
DynDatasource dynDatasource = (DynDatasource)methodSignature.getMethod().getDeclaredAnnotation(DynDatasource.class);
if (dynDatasource == null) {
dynDatasource = (DynDatasource)methodSignature.getDeclaringType().getDeclaredAnnotation(DynDatasource.class);
}

CheckModuleHolder.checkout(dynDatasource.value());
Object object = joinPoint.proceed();
var5 = object;
} catch (Throwable var9) {
throw var9;
} finally {
CheckModuleHolder.release();
}

return var5;
}
}

扫描配置包下的内容,自动加载
@Configuration
@EnableConfigurationProperties({DynamicDatasourceConfigProperties.class})
@ComponentScan({"com.midea.cloud.dynamicds"})
public class DynamicDatasourceAutoConfiguration {
@Autowired
private DynamicDatasourceConfigProperties dynamicDatasourceConfigProperties;

public DynamicDatasourceAutoConfiguration() {
}

@Bean
@ConditionalOnMissingBean
@ConditionalOnClass({DynamicDatasource.class})
public DataSource dataSource() {
DynamicDatasource dynamicDatasource = new DynamicDatasource();
dynamicDatasource.setDynamicDatasourceConfigProperties(this.dynamicDatasourceConfigProperties);
return dynamicDatasource;
}
}

根据启动注解扫描加载对应的配置信息
获取yml文件中指定的配置信息
@ConfigurationProperties(
prefix = "cloud.scc.dynamic"
)
public class DynamicDatasourceConfigProperties {
private Module defaultModule;
private Map<Module, Map<String, Object>> datasouces;

public DynamicDatasourceConfigProperties() {
}

public Module getDefaultModule() {
return this.defaultModule;
}

public void setDefaultModule(Module defaultModule) {
this.defaultModule = defaultModule;
}

public Map<Module, Map<String, Object>> getDatasouces() {
return this.datasouces;
}

public void setDatasouces(Map<Module, Map<String, Object>> datasouces) {
this.datasouces = datasouces;
}
}

这里读取配置新的详情,重写springframework中的AbstractDataSource类,读取数据库详细配置信息
public abstract class AbstractDataSource implements DataSource {
protected final Log logger = LogFactory.getLog(this.getClass());

public AbstractDataSource() {
}

public int getLoginTimeout() throws SQLException {
return 0;
}

public void setLoginTimeout(int timeout) throws SQLException {
throw new UnsupportedOperationException("setLoginTimeout");
}

public PrintWriter getLogWriter() {
throw new UnsupportedOperationException("getLogWriter");
}

public void setLogWriter(PrintWriter pw) throws SQLException {
throw new UnsupportedOperationException("setLogWriter");
}

public <T> T unwrap(Class<T> iface) throws SQLException {
if (iface.isInstance(this)) {
return this;
} else {
throw new SQLException("DataSource of type [" + this.getClass().getName() + "] cannot be unwrapped as [" + iface.getName() + "]");
}
}

public boolean isWrapperFor(Class<?> iface) throws SQLException {
return iface.isInstance(this);
}

public Logger getParentLogger() {
return Logger.getLogger("global");
}
}

配置启动类扫描注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({DynamicDatasourceAutoConfiguration.class})
public @interface EnableDynamicDatasource {
}

根据注解自动加载对应的数据库。
public class CheckModuleHolder {
public static ThreadLocal<Module> moduleThreadLocal = new ThreadLocal();

public CheckModuleHolder() {
}

public static void checkout(Module module) {
moduleThreadLocal.set(module);
}

public static void release() {
moduleThreadLocal.remove();
}

public static Module get() {
return (Module)moduleThreadLocal.get();
}
}

标签:return,springboot,DynDatasource,数据源,配置,Module,public,SQLException,class
From: https://www.cnblogs.com/cp13215158435/p/18135572

相关文章

  • 配置MogDB/openGauss的grafana 的dashboard
    配置MogDB/openGauss的grafana的dashboard本文出处:https://www.modb.pro/db/188684概述我们已经介绍了prometheus+grafana+opengauss_exporter完成对MogDB/openGauss数据库的监控,但这只是第一步,我们还需要通过grafana的dashboard查看各个关注的指标项,本文主要......
  • 【Kubernetes 系列】如何优雅的配置 Java 微服务
    【Kubernetes系列】如何优雅的配置Java微服务 目标创建KubernetesConfigMap和Secret使用MicroProfileConfig注入微服务配置一、实现外部化应用配置在Kubernetes中,为docker容器设置环境变量有几种不同的方式,比如:Dockerfile、kubernetes.yml、Kubernet......
  • day01-02_我的Java学习笔记 (IDEA的安装、配置及使用、IDEA常用快捷键、IEDA创建空工
    1.IDEA的安装及配置1.1IDEA的安装具体操作,详见《04、IDEA安装详解.pdf》1.2IDEA主题配置、字体配置1.3IDEA常用快捷键1.4IDEA修改快捷键在IDEA工具中,Ctrl+空格的快捷键,可以帮助我们补全代码,但是这个快捷键和Windows中的输入法切换快捷键冲突,需要修改IDEA中......
  • SpringBoot+Redis启动报错Unsatisfied dependency expressed through method 'stringR
    SpringBoot+Redis启动报错Applicationrunfailedorg.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'redisTool':Unsatisfieddependencyexpressedthroughfield'stringRedisTemplate';nestedexcep......
  • 本地使用ts配置
    1.需要安装的依赖"dependencies":{"html-webpack-plugin":"^5.5.0","ts-loader":"^9.2.6","ts-node":"^10.4.0","tslib":"^2.3.1","typescript&q......
  • 在Linux中,如何配置和管理iSCSI目标和发起器?
    在Linux中,iSCSI(InternetSmallComputerSystemInterface)是一种将SCSI接口封装在TCP/IP协议中,从而允许在IP网络上进行数据块级存储的技术。iSCSI目标是提供存储的服务器,而iSCSI发起器是访问存储的客户端。1.配置iSCSI目标安装iSCSI目标软件:在目标服务器上安装targetctl和li......
  • 项目搭建基本配置与规范
    项目搭建规范来源于coderwhy一.代码规范1.1.集成editorconfig配置EditorConfig有助于为不同IDE编辑器上处理同一项目的多个开发人员维护一致的编码风格。#http://editorconfig.orgroot=true[*]#表示所有文件适用charset=utf-8#设置文件字符集为utf-8ind......
  • Electerm安装、配置与卸载教程(Windows版)
    Electerm是一款开源免费的终端模拟器,集终端模拟器、文件管理器、SSH远程连接、SFTP客户端等功能于一体。它可以在Windows、macOS和Linux操作系统上运行,为用户提供一个功能丰富、易于使用的终端环境。通过Electerm,用户可以在同一窗口中运行多个SSH会话,轻松管理远程服务器,并使用各......
  • 在Linux中,如何使用fstab文件配置自动挂载?
    在Linux系统中,/etc/fstab是一个非常重要的系统配置文件,用于定义文件系统及其挂载点,以及它们如何在系统启动时自动挂载。当你想要确保某些磁盘分区或者存储设备在系统启动后自动加载并可用时,你需要编辑这个文件。以下是通过/etc/fstab配置自动挂载的详细步骤:1.确认设备和挂载......
  • RIAD配置摘要
    raid什么是RAID独立硬盘冗余阵列(RAID,RedundantArrayofIndependentDisks),旧称廉价磁盘冗余阵列(RedundantArrayofInexpensiveDisks),简称磁盘阵列。利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。RAID层级不同......