本文阐述使用多数据源的额场景,以及如何使用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 修复在 Linux 上使用 SkiaSharp 提示找不到 libSkiaSharp 库

    本文告诉大家如何简单修复在 Linux 上使用 SkiaSharp 提示找不到 libSkiaSharp 库 我的应用在 Windows 上跑的好好的,放在 Linux 上一运行就炸掉了,异常内容如下 ...

  2. dotnet OpenXML 读取 PPT 内嵌 xlsx 格式 Excel 表格的信息

    在 Office 中,可以在 PPT 里面插入表格,插入表格有好多不同的方法,对应 OpenXML 文档存储的更多不同的方式.本文来介绍如何读取 PPT 内嵌 xlsx 格式的表格的方法 读取方法和 ...

  3. 第二讲 Cadence建立工程和元件库

    第二讲 Cadence建立工程和元件库 1.创建工程,设置图纸参数.Design Entry CIS / Orcad Capture CIS / Option /Design Template,可以设 ...

  4. SQL使用ROW_NUMBER() OVER函数自动生成序列号

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说ROW_NUMBER()从1开始,为每一条分组记录返回一个数字,这里的ROW ...

  5. C#实现多线程的几种方式

    前言 多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制.多线程适用于需要提高系统并发性.吞吐量和响应速度的场景,可以充分利用多核处理器和系统资源,提高应用程序的性能和效率. ...

  6. vue3编译优化之“静态提升”

    前言 在上一篇 vue3早已具备抛弃虚拟DOM的能力了文章中讲了对于动态节点,vue做的优化是将这些动态节点收集起来,然后当响应式变量修改后进行靶向更新.那么vue对静态节点有没有做什么优化呢?答案是 ...

  7. 用 C 语言开发一门编程语言 — 更好的语言

    目录 文章目录 目录 前文列表 原生类型 用户定义的类型 [] 方括号的补充 操作系统交互 宏 变量哈希表 池分配 垃圾回收 尾调用优化 词法作用域 静态类型 前文列表 <用 C 语言开发一门编 ...

  8. 食道测压结合Manoview软件

    我认为是位于食道开始的地方是上食道括约肌(UES):upper esophageal sphincte,吞咽时,此处的压力会有变大.食道结束的地方是食道下括约肌(LES),从这在往下就是胃,一般情况这 ...

  9. Android 13 - Media框架(1)- 总览

    关注公众号免费阅读全文,进入音视频开发技术分享群! 为了加深对Android Media框架的理解,决定在这里记录下学习过程中碰到的问题以及一些个人思考.由于本人水平有限,笔记的内容可能会有一些错误, ...

  10. C# xml与对象相互转换

    例如: 1.对象转xml(对象序列化为xml) string strImage= XmlSerializeHelper.Serialize<List<ImageSingle>> ...