本文阐述使用多数据源的额场景,以及如何使用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 修复 GitHub Action 构建过程提示 NETSDK1127 错误

    本文告诉大家,如何修复 GitHub Action 构建过程提示 error NETSDK1127: The targeting pack Microsoft.WindowsDesktop.App.W ...

  2. K8s集群中部署SpringCloud在线购物平台(二)

    三.harbor简介 harbor 是私有镜像仓库,用来存储和分发镜像的 docker 还有一个官方的镜像仓库 docker hub,免费用户只能简单的使用,创建一个私有镜像仓库,存储 镜像,付费用户 ...

  3. github只下载某个文件或文件夹(使用GitZip插件)

    安装GitZip插件 (此安装过程需要梯子(不懂"梯子",百度一下就明白)) 1. 打开插件管理页面 方法一:打开Chrome浏览器(Edge浏览器同理),在Chrom地址栏输入c ...

  4. Ubuntu下MPICH的安装与配置

    原创直达链接 一.MPICH的下载与安装 MPI安装文件下载地址: 博客下载地址 或 官网地址 可以下载3.4.2版本的,本文就是3.4.2版本 1.解压: sudo tar - zxvf mpich ...

  5. cesium介绍和国内主要学习网站汇总

    Cesium官方网站 建议大家将Cesium官网的博客都读一遍,博客大概分为三类,主要是技术类,比如性能优化,调度算法等,一类是定期的新版本特性,能够了解Cesium新功能和新特性,还有一类是大事记, ...

  6. 欧洲对 Splashtop 远程计算机实验室的需求增长十倍

    ​2021 年 1 月 7 日,加利福尼亚州圣何塞 - 远程访问和远程支持解决方案的全球领导者 Splashtop Inc. 报告称其对用于教育的远程实验室访问软件的需求在欧洲激增,在 2020 年第 ...

  7. 各大插件市场智能助手评分榜出炉!百度Comate稳居第一

    近日,在VSCode.Jetbrains等各大插件市场智能助手评分榜中,百度Comate分别以4.5和4.4位列第一,通义灵码位居第二.第三,CodeGeeX.iFlyCode.aiXcoder.Gi ...

  8. uniapp video组件全屏导致页面横竖错乱问题

    uniapp video组件全屏导致页面横竖错乱问题 背景介绍 使用 video组件做一个视频播放功能,不全屏的情况正常.在苹果手机上全屏后,点击左上角退出全屏,页面出现问题如下图问题,主要系统iOS ...

  9. 做程序员这么久,你知道UTF-8和Unicode的关系吗?

    UTF-8和Unicode到底有什么区别?是存储方式不同?编码方式不同?它们看起来似乎很相似,但是实际上他们并不是同一个层次的概念. 要想先讲清楚他们的区别,首先应该讲讲Unicode的来由: 众所周 ...

  10. c# - 如何在圆角 WPF 窗体中创建圆角矩形?

    我正在 WPF 中创建一个应用程序,我想要圆角.收到.现在窗体是无边框的,我正在尝试创建一个圆角矩形并将其放在顶部,使其看起来像 Windows 应用程序的顶部栏. 我做不到. 这是我的代码: < ...