首页 > 数据库 >ava框架Spring 中的动态数据库的使用方法

ava框架Spring 中的动态数据库的使用方法

时间:2024-09-04 18:25:33浏览次数:11  
标签:Spring 数据库 ava Bean DataSource 数据源 public

在 Java 框架 Spring 中,动态数据库的使用通常涉及根据不同条件(如请求的上下文、租户 ID 等)动态切换数据源。Spring 提供了一些方法来实现这一点,以下是一个常见的实现方案:

1. 基于 AbstractRoutingDataSource 实现动态数据库切换

Spring 提供了 AbstractRoutingDataSource 类,可以通过扩展该类来实现动态数据库路由。我们可以根据业务需求动态选择数据源。

步骤一:创建动态数据源路由类

首先,创建一个继承自 AbstractRoutingDataSource 的类,重写 determineCurrentLookupKey 方法。这个方法会根据当前上下文返回需要使用的数据源的标识符。

public class DynamicDataSourceRouter extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        // 从 ThreadLocal 中获取当前数据源标识符
        return DataSourceContextHolder.getDataSource();
    }
}

DataSourceContextHolder 是一个自定义的工具类,用于在 ThreadLocal 中保存当前数据源标识符:

public class DataSourceContextHolder {

    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    public static void setDataSource(String dataSource) {
        CONTEXT_HOLDER.set(dataSource);
    }

    public static String getDataSource() {
        return CONTEXT_HOLDER.get();
    }

    public static void clearDataSource() {
        CONTEXT_HOLDER.remove();
    }
}

步骤二:配置多个数据源

在 Spring 的配置类中,配置多个数据源,并将其注入到 DynamicDataSourceRouter 中。

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("dataSource1", dataSource1());
        targetDataSources.put("dataSource2", dataSource2());

        DynamicDataSourceRouter dynamicDataSourceRouter = new DynamicDataSourceRouter();
        dynamicDataSourceRouter.setDefaultTargetDataSource(dataSource1()); // 设置默认数据源
        dynamicDataSourceRouter.setTargetDataSources(targetDataSources);

        return dynamicDataSourceRouter;
    }

    @Bean
    public DataSource dataSource1() {
        // 配置数据源1
    }

    @Bean
    public DataSource dataSource2() {
        // 配置数据源2
    }
}

步骤三:在业务层切换数据源

在业务层中,可以通过调用 DataSourceContextHolder 来切换当前数据源:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void switchDataSourceAndExecute(String dataSourceKey) {
        try {
            DataSourceContextHolder.setDataSource(dataSourceKey);
            // 执行数据库操作
            userRepository.findAll();
        } finally {
            DataSourceContextHolder.clearDataSource(); // 清理数据源,恢复默认
        }
    }
}

2. 使用 Spring Boot 多数据源配置

在 Spring Boot 项目中,还可以通过配置文件来定义多个数据源,并手动切换或使用 @Primary 注解指定默认数据源。

配置文件定义多个数据源

application.ymlapplication.properties 文件中定义多个数据源:

spring:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/primary_db
      username: root
      password: password
    secondary:
      url: jdbc:mysql://localhost:3306/secondary_db
      username: root
      password: password

配置多个数据源 Bean

在配置类中定义多个数据源 Bean:

@Configuration
public class MultiDataSourceConfig {

    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

使用不同的数据源

在 DAO 层或 Service 层中,通过 @Qualifier 注解指定使用的数据库源:

@Service
public class ProductService {

    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;

    @Autowired
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;

    public void someMethod() {
        // 使用 primaryDataSource 执行操作
    }

    public void anotherMethod() {
        // 使用 secondaryDataSource 执行操作
    }
}

3. 使用第三方库如 Spring Cloud 或 ShardingSphere

对于更复杂的场景,如分库分表、微服务环境中的多数据源管理,可以考虑使用 ShardingSphere、Spring Cloud 等第三方库,它们提供了更加丰富的功能支持动态数据库切换。

总结

通过以上方法,Spring 框架可以轻松实现动态数据库的管理和切换。无论是通过 AbstractRoutingDataSource 的自定义实现,还是通过 Spring Boot 的多数据源配置,都可以在不同场景下有效应用。

标签:Spring,数据库,ava,Bean,DataSource,数据源,public
From: https://www.cnblogs.com/xd502djj/p/18397134

相关文章

  • Java体系中的继承
    前言#继承(Inheritance)是面向对象编程(OOP)中的一个重要概念,它允许一个类(称为子类或派生类)可以从另一个类(称为父类、基类或超类)继承属性(数据)和方法(行为)。简单来说继承主要用于实现共性的抽取,达到代码的复用。1继承1.1什么是继承Java中使用类对实体对象进行描述,而不同的......
  • JSP教学科研时点状态信息管理系统65j79(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:毕业生,就业情况,职位信息,招生情况,师资状况,培养方案,课程信息,课程教材,教学成果,建设项目,创新成果开题报告内容一、研究背景随着教育改革的深入......
  • 基于java+springboot+vue的美发管理系统
    ......
  • java中的锁
    关键字:synchronized介绍synchronized是Java语言中的一个关键字,用于实现线程同步,以确保在多线程环境下对共享资源的访问是安全且一致的。它通过提供一种互斥机制来防止多个线程同时执行特定的代码区域,从而避免了数据不一致性和其他并发问题。以下是关于synchronized的一些关......
  • JSP金融产品销售系统的设计与实现7057n--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、研究背景与意义随着金融市场的......
  • JavaWeb
    JavaWeb1.Servlet<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="......
  • 关于Java链表的一些操作以及力扣原题刷刷刷——反转链表、删除链表的倒数第N个节点
    1、反转链表1.1环境准备,可以自己先尝试实现/***@AuthorMiku*@Date2024/09/0209:54*@DescriptionTODO*@Version1.0*/publicclassSolution{staticclassListNode{intval;ListNodenext;ListNode(intval){......
  • 探秘JavaScript深度领域:精通面向对象编程、虚拟DOM等核心技术
    JaScript作为前端开发的核心技术之一,凭借其强大的灵活性和广泛的应用场景,吸引了大量开发者深入学习。在探秘JaScript的深度领域时,面向对象编程和虚拟DOM等核心技术无疑是两个重要的学习方向。面向对象编程(OOP)在JaScript中扮演着重要角色。虽然JaScript是一种基于原型的语言,而非传......
  • 深入理解JavaScript类与对象:揭秘类字段和静态属性的妙用,js静态属性和实例属性
    在深入理解JaScript类与对象的过程中,类字段和静态属性是两个关键的概念,掌握它们的用法可以让你在实际开发中更加得心应手。虽然JaScript在ES6之前并没有类的概念,但通过ES6及以后的版本,引入了类语法糖,使得我们能够更直观地定义和使用类。类字段是指在类中直接定义的属性,而不是在构......
  • java JRMP学习
    JavaJRMP反序化RMI依赖的通信协议为JRMP(JavaRemoteMessageProtocol,Java远程消息交换协议),该协议为Java定制,基于TCP/IP之上,RMI协议之下,当需要进行RMI远程方法调用通信的时候要求服务端与客户端都为Java编写。、这个协议就像HTTP协议一样,规定了客户端和服务端通信要满足的......