Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景

这篇具有很好参考价值的文章主要介绍了Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当在 Spring Boot 应用程序中使用Spring Data JPA 进行数据库操作时,配置Schema名称是一种常见的做法。然而,在某些情况下,模式名称需要是动态的,可能会在应用程序运行时发生变化。比如:需要做数据隔离的SaaS应用。

所以,这篇博文将帮助您解决了在 Spring Boot 应用程序中如何设置动态 Schema。

问题场景

假设,您的应用程序是一个SaaS软件,需要为多个租户提供服务,每个租户都需要一个单独的数据库架构。

在这种情况下,在应用程序属性中对Shema名称进行硬编码是不太可能的,这样有一个用户新增,就要去写代码更新。

所以,为了应对这一挑战,我们将探索一种允许在运行时动态配置模式名称的解决方案。

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。

代码案例

让我们创建一个 Spring Boot 项目 首先设置一个具有必要依赖项的新 Spring Boot 项目。在项目配置中包括 Spring Web、Spring Data JPA 和关于数据库的依赖项。

定义Spring Data JPA的实体类,例如:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "product")
public class Product {
    @Id
    private Long id;
    private String name;
    private double price;

}

创建数据访问接口,以便您的实体提供 CRUD 操作:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {

}

创建一个用来处理业务逻辑,包括与数据库交互的方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ProductService {
    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    public List<Product> getAllProducts() {
        return productRepository.findAll();
    }

}

实现API接口:

import org.springframework.beans.factory.annotation.Autowired;
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;

@RestController
@RequestMapping("/api/products")
public class ProductController {
    private final ProductService productService;

    @Autowired
    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @GetMapping
    public List<Product> getAllProducts() {
        return productService.getAllProducts();
    }

}

重点:配置动态Schema

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DynamicSchemaConfig {

    @Value("${custom.schema.name}")
    private String customSchemaName;

    @Bean
    public DataSource dataSource() {
        String dataSourceUrl = "jdbc:mysql://localhost:3306/" + customSchemaName;
        return DataSourceBuilder.create().url(dataSourceUrl).build();
    }
}

重新打包该Spring Boot应用,然后当我们要为不同用户使用完全隔离的数据库、完全隔离的应用的时候,只需要通过下面的启动命令,就能轻松实现了:

java -jar -Dcustom.schema.name=my_dynamic_schema your-application.jar

这里,通过启动命令中的custom.schema.name参数,就能去指定不同的数据库Schema,而应用程序端都是同一套代码,由于启动了新的Spring Boot应用,所以应用端进程也是完全隔离的。这种方法,对于使用Spring Boot构建需要一定资源隔离SaaS软件来说,是个不错的实现方案。

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源文章来源地址https://www.toymoban.com/news/detail-858829.html

到了这里,关于Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用dynamic-datasource-spring-boot-starter动态切换数据源操作数据库(MyBatis-3.5.9)

    记录 :383 场景 :使用dynamic-datasource-spring-boot-starter动态切换数据源,使用MyBatis操作数据库。提供三种示例:一,使用@DS注解作用到类上。二,使用@DS注解作用到方法上。三,不使用注解,使用DynamicDataSourceContextHolder类在方法内灵活切换不同数据源。 源码: https://github.com/

    2024年01月20日
    浏览(36)
  • Spring Boot 如何整合高性能数据库连接池HikariCP

    当使用Spring Boot整合HikariCP时,您可以更加详细地配置和优化连接池以获得更好的性能。以下是更详细的步骤和示例代码: 步骤1:创建Spring Boot项目 您可以使用Spring Initializr(https://start.spring.io/)创建一个新的Spring Boot项目。确保选择适合您的需求的依赖项,例如Web和Spring D

    2024年02月05日
    浏览(52)
  • Spring Boot实战 | 如何整合高性能数据库连接池HikariCP

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月08日
    浏览(37)
  • 如何在Spring Boot应用中使用Nacos实现动态更新数据源

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月10日
    浏览(26)
  • 【Spring Boot】Spring Boot 配置 Hikari 数据库连接池

    数据库连接池是一个提高程序与数据库的连接的优化,连接池它主要作用是提高性能、节省资源、控制连接数、连接管理等操作; 程序中的线程池与之同理,都是为了优化、提高性能。

    2024年02月11日
    浏览(32)
  • Spring Boot:数据库的整合

    在 Spring Boot :Web开发之视图模板技术的整合 文章中,介绍了 Spring Boot 整合视图模板技术。然而,仅仅整合视图模板技术可能还不能满足所有业务需求,因此还需要进一步扩展 Spring MVC 的默认配置。 简单补充说明 : 扩展 Spring Boot 中的 Spring MVC 默认配置通常涉及实现 WebMvcC

    2024年04月13日
    浏览(32)
  • Spring Boot对接Oracle数据库

    最近学习了Oracle数据库,那么如何使用Spring Boot和MyBatis Plus对接Oracle数据库呢? 这就有了这篇随记,具体流程如下 创建一个空的Maven工程,导入如下依赖: tips:这里碰到一个坑,我本机适用的Oracle数据库版本是11g XE,所以要使用的驱动为ojdbc5/ojdbc6,不然连接老会失败。 在配

    2024年02月09日
    浏览(34)
  • 【Spring Boot】通过AOP拦截Spring Boot日志并将其存入数据库

    在软件开发中,常常需要记录系统运行时的日志。日志记录有助于排查系统问题、优化系统性能、监控操作行为等。本文将介绍如何使用Spring Boot和AOP技术实现拦截系统日志并保存到数据库中的功能。 本文将通过以下步骤实现拦截系统日志并保存到数据库中的功能: 配置数据

    2024年02月10日
    浏览(31)
  • Spring Boot MySQL数据库的使用

    目录 简介Spring Boot Spring Boot的优点 Spring Boot连接数据库 1.添加依赖 1.2开启连接数据库 1.2.1 如果没有开启数据库运行程序的时候会出现这样的报错这就是没有连接数据库,所以我们开启数据库即可使用。 1.2.2 我的名字是MySQL110所以一会用命令字符开启数据库的时候用的就是这

    2024年04月10日
    浏览(32)
  • Spring Boot项目实现无数据库启动

    今天需要创建一个不连接数据库的Spring Boot工程, 结果一切配置好后项目却启动失败, 提示如下: 查询了一下资料, 发现原来Spring Boot启动时是默认是要连接数据库的, 这样一来只需要把数据库的一些配置排除掉就可以了: 重新启动, 项目成功运行了。另外, pom.xml文件中也不要引入

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包