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

yizhihongxing

下面我将详细讲解“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日

相关文章

  • Spring cloud oauth2如何搭建认证资源中心

    Spring Cloud Oauth2是Spring Cloud生态中基于Oauth2.0协议实现的授权、认证框架。它将授权、认证、鉴权的功能进行了拆分,将获得token的过程分离出来形成一个微服务,我们可以称之为认证服务认证中心,而资源服务需要鉴权的时候可以通过Feign请求认证服务获取token后再访问资源服务。下面是搭建认证资源中心的详细攻略。 1. …

    Java 2023年5月20日
    00
  • Spring Bean的实例化之属性注入源码剖析过程

    详细讲解“Spring Bean的实例化之属性注入源码剖析过程”的攻略如下。 1. Spring Bean的实例化 Spring Bean的实例化是指将一个Java对象实例化,并加入到Spring容器中,成为Spring管理的Bean。实例化Bean的过程可以通过XML配置文件、注解等方式来完成。 2. 属性注入 属性注入是指在Bean实例化之后,通过反射等…

    Java 2023年6月15日
    00
  • SpringBoot+MybatisPlus+Mysql+JSP实战

    以下是关于SpringBoot+MybatisPlus+Mysql+JSP实战的完整攻略,内容包括环境搭建、数据库操作、页面渲染等: 环境搭建 安装JDK、Maven等开发环境。 创建一个SpringBoot项目,可以使用Spring Initializr或者IDEA等工具快速创建。 在项目的pom.xml文件中添加mybatis-plus和mysql依赖,…

    Java 2023年5月20日
    00
  • Java简单实现调用命令行并获取执行结果示例

    首先我们需要了解Java如何调用命令行来执行外部的命令。在Java中,可以通过ProcessBuilder或Runtime.getRuntime().exec()两种方式实现。 使用ProcessBuilder调用命令行 ProcessBuilder是一个Java API,它提供了一个类来启动外部进程并与其进行交互。下面是一个简单的Java程序,它使用Pro…

    Java 2023年5月23日
    00
  • JS实现改变HTML上文字颜色和内容的方法

    要实现改变HTML上文字颜色和内容,需要掌握以下知识: 从HTML DOM中获取元素:使用document对象下的方法,如getElementById等,获取需要改变的元素节点。 更改元素样式:使用style对象下的属性,如color,backgroundColor等,改变元素样式。 更改元素内容:使用innerHTML属性,将元素内容替换为新的内容。 下面…

    Java 2023年5月26日
    00
  • java如何判断一个对象是否为空对象

    判断一个Java对象是否为空对象,通常可以通过以下几种方式进行: 1. 使用 == 进行判断 我们可以使用 Java 中的双等号 “==” 运算符来判断一个对象是否为 null。如果对象为 null,则其值为 null,否则就是一个有效对象。 下面是一个示例代码: Object object = null; if (object == null) { Sys…

    Java 2023年5月26日
    00
  • jsp项目中更改tomcat的默认index.jsp访问路径的方法

    下面是“JSP项目中更改Tomcat的默认index.jsp访问路径”的攻略: 一、背景知识 在 JSP 项目中,如果未指定请求 URL 的具体文件路径,Tomcat 会自动访问项目根目录下的 index.jsp 文件。但是有些情况下,我们希望更改这个默认行为,并指定其他文件作为默认首页。 二、注意事项 在更改默认首页前,需要注意以下几点: 更改的默认首页必…

    Java 2023年6月15日
    00
  • 详解maven的install的作用

    下面我来详细讲解一下“详解maven的install的作用”的完整攻略。 什么是 Maven Maven 是一个基于项目对象模型(POM)、依赖管理、构建生命周期和插件化架构的项目管理工具。通过Maven的POM文件,可以管理项目的依赖、生命周期、构建、测试等各个环节。 Maven Install 在 Maven 中,install 是指安装构建的文件到本地…

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