springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter)

下面我将详细讲解“springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter)”的完整攻略。

什么是dynamic-datasource-spring-boot-starter

dynamic-datasource-spring-boot-starter(以下简称DDSS)是一款基于Spring Boot的多数据源管理框架,它也是一个Spring Boot的starter,能够自动化地配置多数据源,并支持在代码中切换数据源。

如何使用dynamic-datasource-spring-boot-starter

下面,我将简单介绍如何使用dynamic-datasource-spring-boot-starter。

首先,在pom.xml文件中引入以下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>2.7.0</version>
</dependency>

引入依赖之后,我们需要在application.yml或application.properties文件中进行如下配置:

spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root

这里我们配置了三个数据源,一个主数据源和两个从数据源。

接着,在项目的代码中,可以通过以下方式动态切换数据源:

@Service
public class UserServiceImpl implements UserService {

    /**
     * 多数据源注入
     *
     * @return
     */
    @Autowired
    private DataSource dataSource;

    /**
     * 注入JdbcTemplate
     *
     * @return
     */
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    @Override
    public User getUserById(Long id) {

        //获取主数据源
        DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.MASTER);
        String sql = "SELECT * FROM user WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 查询所有用户
     *
     * @return
     */
    @Override
    public List<User> getAllUser() {

        //获取从数据源1
        DynamicDataSourceContextHolder.setDataSourceKey("slave1");
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 根据用户名和密码查询用户
     *
     * @param userName
     * @param password
     * @return
     */
    @Override
    public User getUserByUserNameAndPassword(String userName, String password) {

        //获取从数据源2
        DynamicDataSourceContextHolder.setDataSourceKey("slave2");
        String sql = "SELECT * FROM user WHERE user_name = ? and password = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{userName, password}, new BeanPropertyRowMapper<>(User.class));
    }
}

这里我们通过使用DynamicDataSourceContextHolder.setDataSourceKey()方法,动态切换数据源。

dynamic-datasource-spring-boot-starter的示例

下面,我将给出两个dynamic-datasource-spring-boot-starter的示例。

示例一

在此示例中,我们首先需要在application.yml或application.properties文件中进行如下配置:

spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root

然后,在项目的代码中,通过以下方式动态切换数据源:

@Service
public class UserServiceImpl implements UserService {

    /**
     * 多数据源注入
     *
     * @return
     */
    @Autowired
    private DataSource dataSource;

    /**
     * 注入JdbcTemplate
     *
     * @return
     */
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    @Override
    public User getUserById(Long id) {

        //获取主数据源
        DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.MASTER);
        String sql = "SELECT * FROM user WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 查询所有用户
     *
     * @return
     */
    @Override
    public List<User> getAllUser() {

        //获取从数据源1
        DynamicDataSourceContextHolder.setDataSourceKey("slave1");
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 根据用户名和密码查询用户
     *
     * @param userName
     * @param password
     * @return
     */
    @Override
    public User getUserByUserNameAndPassword(String userName, String password) {

        //获取从数据源2
        DynamicDataSourceContextHolder.setDataSourceKey("slave2");
        String sql = "SELECT * FROM user WHERE user_name = ? and password = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{userName, password}, new BeanPropertyRowMapper<>(User.class));
    }
}

示例二

在此示例中,我们使用dynamic-datasource-spring-boot-starter来实现读写分离。

首先,我们需要在application.yml或application.properties文件中进行如下配置:

spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
  shardingsphere:
    ds:
      primary:
        url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
      replica1:
        url: jdbc:mysql://localhost:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
      replica2:
        url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
    masterslave:
      name: ms
      load-balance-algorithm-type: round_robin
      master-data-source-name: primary
      slave-data-source-names: replica1, replica2
      slave-data-source-selector: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.master_slave.RandomSlaveDataSourceSelector

这里我们配置了一个主数据源和两个从数据源,并使用了ShardingSphere实现了读写分离。

然后,在项目的代码中,通过以下方式动态切换数据源:

@Service
public class UserServiceImpl implements UserService {

    /**
     * 多数据源注入
     *
     * @return
     */
    @Autowired
    private DataSource dataSource;

    /**
     * 注入JdbcTemplate
     *
     * @return
     */
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    @Override
    public User getUserById(Long id) {

        //获取主数据源
        DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.MASTER);
        String sql = "SELECT * FROM user WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 查询所有用户
     *
     * @return
     */
    @Override
    public List<User> getAllUser() {
        RandomSlaveDataSourceSelector.setSlaveIndex(new Random().nextInt(2));
        DynamicDataSourceContextHolder.setDataSourceKey("ms");
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 根据用户名和密码查询用户
     *
     * @param userName
     * @param password
     * @return
     */
    @Override
    public User getUserByUserNameAndPassword(String userName, String password) {

        RandomSlaveDataSourceSelector.setSlaveIndex(new Random().nextInt(2));
        DynamicDataSourceContextHolder.setDataSourceKey("ms");
        String sql = "SELECT * FROM user WHERE user_name = ? and password = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{userName, password}, new BeanPropertyRowMapper<>(User.class));
    }
}

这里我们通过使用DynamicDataSourceContextHolder.setDataSourceKey()方法和RandomSlaveDataSourceSelector实现了对数据源的动态切换。需要注意的是,在读写分离的场景下,需要使用ShardingSphere的配置方式来实现数据源的切换。

以上就是关于“springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter)”的完整攻略和两个示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java 类在 Tomcat 中是如何加载的(过程分析)

    Java类在Tomcat中是如何加载的过程可以分为以下三个步骤: 类加载前的准备工作 在Tomcat启动时,会根据配置文件中的信息初始化一个工作目录,其中包含了lib、classes和shared等文件夹。其中,lib目录下存放的是Tomcat本身的类库,classes目录下则存放了应用程序的类文件和相关资源文件,shared目录下则用于存放可共享的类库。 …

    Java 2023年6月2日
    00
  • JAVA初级项目——实现图书管理系统

    JAVA初级项目——实现图书管理系统 项目概述 图书管理系统是一个针对图书馆、书店等场所用来管理图书的软件。该系统可以实现图书的借阅、归还、查询、添加、删除等功能,提高了图书管理的效率。 本项目主要是通过Java语言和基于Web的技术实现一个简单的图书管理系统,主要包括以下功能模块: 用户登录和注册:用户可实现登录和注册账号。 图书管理:管理员可添加、删除图…

    Java 2023年5月23日
    00
  • Maven如何构建可执行的jar包(包含依赖jar包)

    Maven是一个流行的Java构建工具,可以自动化构建、管理和部署Java项目。将Java项目打包成可执行的jar包是Maven常见的一个任务,特别是包含依赖jar包的情况。以下是构建可执行的jar包的完整攻略: 步骤一:配置Maven pom.xml文件 在Maven项目的根目录下,打开pom.xml文件,添加以下插件和配置: <build> …

    Java 2023年5月20日
    00
  • SpringBoot2.x配置HTTPS访问的过程

    下面是“SpringBoot2.x配置HTTPS访问的过程”的完整攻略。 1. 生成证书 首先需要生成一对密钥(证书和私钥),可以使用 keytool 工具来生成。在终端中执行以下命令: keytool -genkeypair -alias mycertalias -keyalg RSA -keysize 2048 -storetype PKCS12 -ke…

    Java 2023年5月19日
    00
  • Java自定义异常简单示例

    Java自定义异常是Java语言的一个重要特性,支持用户自定义异常类型来满足特定的业务需求,并通过异常处理机制帮助程序员提高代码的可读性和可维护性。本文将介绍Java自定义异常的简单示例,帮助读者了解Java自定义异常的基本使用方法和常见案例。 为什么需要自定义异常? Java语言支持多种异常类型,如IllegalArgumentException、Null…

    Java 2023年5月27日
    00
  • Spring Boot事务配置详解

    SpringBoot事务配置详解 SpringBoot提供了非常便利的事务管理功能,使得开发者可以更加方便地进行事务编码。本文将为您详细介绍SpringBoot事务的配置方法以及相关示例。 事务的基本概念 在数据库应用程序中,事务是一些相关的数据库操作,它们被当做一个整体来处理。如果其中任何一个操作失败,整个事务将被回滚到一开始的状态。 SpringBoot…

    Java 2023年5月15日
    00
  • 一文探索Java文件读写更高效方式

    针对Java文件读写更高效方式的攻略,我可以提供以下内容: 1. 使用NIO NIO(New I/O),即为非阻塞 IO。相比于传统的 IO,它可以提供更高效的文件读写方式。其主要的类库为java.nio。使用NIO的关键是Buffer和Channel两个概念。其中Buffer为缓冲区,用来读写数据;Channel则代表数据源,如文件或网络连接,我们从Cha…

    Java 2023年5月20日
    00
  • php UEditor百度编辑器安装与使用方法分享

    PHP UEditor百度编辑器安装与使用方法分享 什么是PHP UEditor百度编辑器? PHP UEditor百度编辑器是一个基于JavaScript的所见即所得富文本编辑器,能够在Web浏览器中编辑HTML文本和其他富媒体,如照片和视频。它是一个轻量级、高度定制的编辑器,非常适合PHP开发人员集成到他们的网站中。 安装PHP UEditor百度编辑器…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部