本文阐述使用多数据源的额场景,以及如何使用springboot的配置多数据源。

关于后者,主要是直接引用其它博文:https://blog.csdn.net/u012060033/article/details/123759694

如果不想了解不太必要知道的,建议查看 https://www.cnblogs.com/chen-msg/p/7485701.html

一、多数据源的使用场景

使用多数据源的原因一般有:

  1. 数据采集
  2. 分库
  3. 其它

本文主要讨论的是分库问题。现在讨论的一般所谓“分库”是主要因为两个目的:

  1. 实现多租户
  2. 数据的水平分割,以便增加数据吞吐能力
  3. 读写分离

实现多租户

在某些前提下,通过分库来实现多租户也是可以,例如不想浪费应用服务器的资源,减少维护的压力。

但这个行为,本人并不是很认可。因为当你的客户没有多少数据量的时候,分库分表其实没有太大意义。

如果客户的数据很多,那么客户应该给出更多的钱,这种情况下也没有必要和其它客户共享一个硬件资源。

至于业界一直鼓吹的SAAS,云之类的,大部分业务场景下,对于大公司并没有特别的吸引力。因为财大气粗,这个时候他们主要考虑一个问题:数据安全性。

大一点的公司也是这个思路。例如字节自己建立数据中心,也是类似的心思:安全,不想受制于人等等。

所以,现今国内大公司更多的做法是:自己采购服务器,自己组建it团队。和其它公司共享一个别的公司运营的云平台,把关键的商务数据放上去,不太可能的。

读写分离

这个建议直接使用数据库自身的功能了。但如果的确有某些不得不用的理由,也是可以的。

不过项目做多了,总是有一些特别的要求,所以本章节不再讨论要不要使用多数据源。

二、配置多数据源

2.1配置多数据源所需要面临的几个问题

  • 如果有ocrm等和数据源有关的组件,那么这些组件内部如何切换
  • 多个数据源之间的事务一致性如何处理(如果它们有关系的话)
  • 切换数据源的成本如何降低一些,即如何使用更少的资源和更少的计算能力来进行切换

如何保持事务一致性的话题内容太多,此处略过。

所以剩下的主要关心问题就是如何切换。

如果是mybatis或者mybatis-plus等orm还是相对友好的--因为是现成的。如果是自己编写的ocrm框架,那么需要稍微花费一些心思。

2.2一般的实现方式

spring本身支持多数据源的配置,所以难度上并没有什么。对于设计人员而言,主要工作是慎重选择实现的方式。

spring的方式步骤:

  1. 定义个数据源
  2. 定义数据源有关的bean对象:datasource,jdbcTemplate,事务管理器等等

其它变化都是基于以上基础实现的。

以下文章讲解的比较清楚:https://www.cnblogs.com/chen-msg/p/7485701.html

三、例子

例子上按照https://www.cnblogs.com/chen-msg/p/7485701.html来编写。

运行环境:windows11 ,mysql8.0.x,springboot 2.6.7

3.1 application.properties

spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.autoCommit=false
spring.datasource.hikari.connectionTimeout=180000
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.maxLifetime=1800000
spring.datasource.hikari.minimumIdle=3
spring.datasource.hikari.maximumPoolSize=6
spring.datasource.hikari.connection-test-query=select 1 #多数据源演示
spring.datasource.school.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.school.jdbcUrl=jdbc:mysql://localhost:7799/spring?rewriteBatchedStatements=true&autoReconnect=true&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.school.username=spring
spring.datasource.school.password=123 spring.datasource.factory.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.factory.jdbcUrl=jdbc:mysql://localhost:7799/factory?rewriteBatchedStatements=true&autoReconnect=true&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.factory.username=spring
spring.datasource.factory.password=123

3.2 DataSourceConfig.java --配置数据源

package com.example.multids.config;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager; @Configuration
public class DataSourceConfig {
@Bean(name = "factoryDataSource")
@Qualifier("factoryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.factory")
public DataSource factoryDataSource()
{
System.out.println("-------------------- factoryDataSource init ---------------------");
return DataSourceBuilder.create().build();
} @Bean(name = "schoolDataSource")
@Qualifier("schoolDataSource")
@ConfigurationProperties(prefix = "spring.datasource.school")
public DataSource schoolDataSource()
{
System.out.println("-------------------- schoolDataSource init ---------------------");
return DataSourceBuilder.create().build();
} @Bean(name = "schoolJdbcTemplate")
@Qualifier("schoolJdbcTemplate")
public JdbcTemplate schoolJdbcTemplate(@Qualifier("schoolDataSource") DataSource dataSource)
{
return new JdbcTemplate(dataSource);
} @Bean(name = "factoryJdbcTemplate")
@Qualifier("factoryJdbcTemplate")
public JdbcTemplate factoryJdbcTemplate(@Qualifier("factoryDataSource") DataSource dataSource)
{
return new JdbcTemplate(dataSource);
} /******配置事务管理********/ @Bean
public PlatformTransactionManager schoolTransactionManager(@Qualifier("schoolDataSource")DataSource ds) {
return new DataSourceTransactionManager(ds);
} @Bean
public PlatformTransactionManager factoryTransactionManager(@Qualifier("factoryDataSource")DataSource ds) {
return new DataSourceTransactionManager(ds);
}
}

3.3 SqlController- 测试控制器

package com.example.multids.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping(value = "/multids")
public class SqlController { @Qualifier("schoolJdbcTemplate")
@Autowired
private JdbcTemplate jdbcTp; @Qualifier("factoryJdbcTemplate")
@Autowired
private JdbcTemplate factoryJdbcTp; @RequestMapping(value = "getAll", method = { RequestMethod.GET, RequestMethod.POST })
public Object getAll() {
String sql = "select * from student limit 2";
List<Map<String, Object>> studentList = jdbcTp.queryForList(sql);
String inventorySql = "select * from inventory limit 2";
List<Map<String, Object>> inventoryList = factoryJdbcTp.queryForList(inventorySql);
Map<String, Object> result = new HashMap<>();
result.put("student-spring-ds", studentList);
result.put("inventory-factory-ds", inventoryList);
return result;
}
}

3.4 测试结果

浏览器执行结果:http://localhost:8081/multids/getAll

四、小结

总体而言,配置还是比较简单。

spring多数据源配置笔记的更多相关文章

  1. 基于xml的Spring多数据源配置和使用

    上一篇讲了<基于注解的Spring多数据源配置和使用>,通过在类或者方法上添加@DataSource注解就可以指定某个数据源.这种方式的优点是控制粒度细,也更灵活. 但是当有些时候项目分模 ...

  2. spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置

    spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...

  3. 基于注解的Spring多数据源配置和使用(非事务)

    原文:基于注解的Spring多数据源配置和使用 1.创建DynamicDataSource类,继承AbstractRoutingDataSource package com.rps.dataSourc ...

  4. spring(16)------spring的数据源配置

    在spring中,通过XML的形式实现数据源的注入有三种形式. 一.使用spring自带的DriverManagerDataSource 使用DriverManagerDataSource配置数据源与 ...

  5. 基于注解的Spring多数据源配置和使用

    前一段时间研究了一下spring多数据源的配置和使用,为了后期从多个数据源拉取数据定时进行数据分析和报表统计做准备.由于之前做过的项目都是单数据源的,没有遇到这种场景,所以也一直没有去了解过如何配置多 ...

  6. Spring jndi数据源配置方法

    xml配置: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverMana ...

  7. spring 多数据源配置

    多数据源配置方法: 在配置数据源配置文件中多加一个数据源配置即可: <bean id="dataSource" class="org.apache.commons. ...

  8. Spring 多数据源配置(转)

    转载自:https://www.cnblogs.com/digdeep/p/4512368.html 同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据 ...

  9. Spring boot 数据源配置。

    配置文件 : spring boot  配置文件 有两种形式 ,一种是properties文件.一种是yml文件.案列使用properties文件. 数据源的默认配置 : spring boot 约定 ...

  10. spring多数据源配置

    项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此.多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源.例如在一个spring和hibernate的框架的 ...

随机推荐

  1. dotnet 使用 WpfAnalyzers 辅助分析 WPF 应用代码缺陷

    引入 WpfAnalyzers 代码分析工具,相当于给团队加入一个免费的代码审查工具人,可以帮忙在日常开发找到很多代码缺陷.加入 WpfAnalyzers 代码分析工具,可以减少代码编写里的低级缺陷, ...

  2. 习题8 #第8章 Verilog有限状态机设计-4 #Verilog #Quartus #modelsim

    4. 用状态机设计交通灯控制器,设计要求:A路和B路,每路都有红.黄.绿三种灯,持续时间为:红灯45s,黄灯5s,绿灯40秒. A路和B路灯的状态转换是: (1) A红,B绿(持续时间40s): (2 ...

  3. 在.Net中操作redis

    在.Net中操作redis 一.环境 .Net 7 redis 7.2.4 二.所需类包 StackExchange.Redis 三.连接redis信息 appsettings.json配置redis ...

  4. 手把手搭建WebSocket多人在线聊天室(SpringBoot+WebSocket)

    前言 本文中搭建了一个简易的多人聊天室,使用了WebSocket的基础特性. 源代码来自老外的一篇好文: https://www.callicoder.com/spring-boot-websocke ...

  5. Linux上OcenBase单机版部署及基本信息查询

    OceanBase单机版部署可以通过在线和离线两种方式部署.在线部署可以通过yum源或者apt源部署,直接拉取官方源码即可.实际使用中,大部分环境连不了外网,本文介绍离线方式安装. 下载"O ...

  6. SpringBoot3.1.5对应新版本SpringCloud开发(1)-Eureka注册中心

    服务的提供者和消费者 服务之间可以通过Spring提供的RestTemplate来进行http请求去请求另一个Springboot的项目,这就叫做服务间的远程调用. 当一个服务通过远程调用去调用另一个 ...

  7. Atm/抢掠计划——题解

    题目描述 样例 6 7 1 2 2 3 3 5 2 4 4 1 2 6 6 5 10 12 8 16 1 5 1 4 4 3 5 6 47 解析 题目明显是最长路,可以用spfa求最长路,但数据范围5 ...

  8. 前后端分离项目集成PageOffice——实现在线编辑Word文件的版本控制

    PageOffice本身提供了SaveFilePage的js方法,但是由于该方法不支持代理且不能跨域导致在前后端分离项目中无法使用 功能:实现三个按钮分别保存不同版本的文件 1.PageOffice可 ...

  9. 基于FPGA的4x4矩阵键盘驱动设计---第一版

    欢迎各位朋友关注"郝旭帅电子设计团队",本篇为各位朋友介绍基于FPGA的4x4矩阵键盘驱动设计---第一版 功能说明: 1. 驱动4x4矩阵键盘:按下任意一个按键,解析出对应按键信 ...

  10. .NET 9 预览版:打造云原生及人工智能 AI 平台

    前言 微软发布了 .NET 9 首个预览版,分享.NET团队对 .NET 9 的初步愿景,该愿景将于今年年底在 .NET Conf 2024 上发布. 重点关注针对云原生和人工智能领域的应用程序开发以 ...