spring多数据源配置笔记
本文阐述使用多数据源的额场景,以及如何使用springboot的配置多数据源。
关于后者,主要是直接引用其它博文:https://blog.csdn.net/u012060033/article/details/123759694
如果不想了解不太必要知道的,建议查看 https://www.cnblogs.com/chen-msg/p/7485701.html
一、多数据源的使用场景
使用多数据源的原因一般有:
- 数据采集
- 分库
- 其它
本文主要讨论的是分库问题。现在讨论的一般所谓“分库”是主要因为两个目的:
- 实现多租户
- 数据的水平分割,以便增加数据吞吐能力
- 读写分离
实现多租户
在某些前提下,通过分库来实现多租户也是可以,例如不想浪费应用服务器的资源,减少维护的压力。
但这个行为,本人并不是很认可。因为当你的客户没有多少数据量的时候,分库分表其实没有太大意义。
如果客户的数据很多,那么客户应该给出更多的钱,这种情况下也没有必要和其它客户共享一个硬件资源。
至于业界一直鼓吹的SAAS,云之类的,大部分业务场景下,对于大公司并没有特别的吸引力。因为财大气粗,这个时候他们主要考虑一个问题:数据安全性。
大一点的公司也是这个思路。例如字节自己建立数据中心,也是类似的心思:安全,不想受制于人等等。
所以,现今国内大公司更多的做法是:自己采购服务器,自己组建it团队。和其它公司共享一个别的公司运营的云平台,把关键的商务数据放上去,不太可能的。
读写分离
这个建议直接使用数据库自身的功能了。但如果的确有某些不得不用的理由,也是可以的。
不过项目做多了,总是有一些特别的要求,所以本章节不再讨论要不要使用多数据源。
二、配置多数据源
2.1配置多数据源所需要面临的几个问题
- 如果有ocrm等和数据源有关的组件,那么这些组件内部如何切换
- 多个数据源之间的事务一致性如何处理(如果它们有关系的话)
- 切换数据源的成本如何降低一些,即如何使用更少的资源和更少的计算能力来进行切换
如何保持事务一致性的话题内容太多,此处略过。
所以剩下的主要关心问题就是如何切换。
如果是mybatis或者mybatis-plus等orm还是相对友好的--因为是现成的。如果是自己编写的ocrm框架,那么需要稍微花费一些心思。
2.2一般的实现方式
spring本身支持多数据源的配置,所以难度上并没有什么。对于设计人员而言,主要工作是慎重选择实现的方式。
spring的方式步骤:
- 定义个数据源
- 定义数据源有关的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多数据源配置笔记的更多相关文章
- 基于xml的Spring多数据源配置和使用
上一篇讲了<基于注解的Spring多数据源配置和使用>,通过在类或者方法上添加@DataSource注解就可以指定某个数据源.这种方式的优点是控制粒度细,也更灵活. 但是当有些时候项目分模 ...
- spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置
spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...
- 基于注解的Spring多数据源配置和使用(非事务)
原文:基于注解的Spring多数据源配置和使用 1.创建DynamicDataSource类,继承AbstractRoutingDataSource package com.rps.dataSourc ...
- spring(16)------spring的数据源配置
在spring中,通过XML的形式实现数据源的注入有三种形式. 一.使用spring自带的DriverManagerDataSource 使用DriverManagerDataSource配置数据源与 ...
- 基于注解的Spring多数据源配置和使用
前一段时间研究了一下spring多数据源的配置和使用,为了后期从多个数据源拉取数据定时进行数据分析和报表统计做准备.由于之前做过的项目都是单数据源的,没有遇到这种场景,所以也一直没有去了解过如何配置多 ...
- Spring jndi数据源配置方法
xml配置: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverMana ...
- spring 多数据源配置
多数据源配置方法: 在配置数据源配置文件中多加一个数据源配置即可: <bean id="dataSource" class="org.apache.commons. ...
- Spring 多数据源配置(转)
转载自:https://www.cnblogs.com/digdeep/p/4512368.html 同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据 ...
- Spring boot 数据源配置。
配置文件 : spring boot 配置文件 有两种形式 ,一种是properties文件.一种是yml文件.案列使用properties文件. 数据源的默认配置 : spring boot 约定 ...
- spring多数据源配置
项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此.多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源.例如在一个spring和hibernate的框架的 ...
随机推荐
- [Contract] ETH 与 Gas 之间的价格转换关系, Ethereum Gas Price Chart
以太坊网络每天的平均气价(Gas)是变化,有一张价格表:https://etherscan.io/chart/gasprice 然后你可以知道 1 Gas = xx Gwei,再换算一下 1 ETH ...
- UNO 的 SamplesApp.Skia.Gtk 丢失字体文件抛出空异常
在运行 UNO 的 SamplesApp.Skia.Gtk 例子程序时,如果没有拷贝字体文件夹,导致字体丢失,将会在运行的时候抛出 NullReferenceException 空异常 抛出的异常堆栈 ...
- Win32 使用 CreateProcess 方法让任务管理器里的命令行不显示应用文件路径
本文记录一个 Win32 的有趣行为,调用 CreateProcess 方法传入特别的参数,可以让任务管理器里的命令行不显示应用文件路径 开始之前,先看看下面这张有趣的图片 可以看到我编写的 Svca ...
- warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d",&f);
这个是C语言当中常见的错误,意思是 对于输入的scanf参数的内容,没有进行类型判断,所以才会产生这个问题. 解决方法: 1.添加if判断方式 1 if(scanf("%d",&a ...
- kubernetes运行应用Controller3之Job、CronJob详解
成功启动一个Job 1.Job.spec.template.metadata,没有空格符的错误 [machangwei@mcwk8s-master ~]$ cat mcwJob1.yml apiVer ...
- [Unity] 实现AssetBundle资源加载管理器
实现Unity AssetBundle资源加载管理器 AssetBundle是实现资源热更新的重要功能,但Unity为其提供的API却十分基(jian)础(lou).像是自动加载依赖包.重复加载缓存. ...
- 深入解析LinkedHashMap
LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序. ...
- Android 13 - Media框架(32)- ACodec(八)
关注公众号免费阅读全文,进入音视频开发技术分享群! 拖了好久都没有更新,前面写的东西都有些忘了,回过头来再看之前写的内容,觉得有很多地方写的不好,或者说现在又有了新的理解,想要重新修改但是需要修改的内 ...
- Android 13 - Media框架(25)- OMXNodeInstance(二)
关注公众号免费阅读全文,进入音视频开发技术分享群! 上一节我们了解了 OMXNodeInstance 的创建过程,以及 IOmx 服务和 OMXNodeInstance.OMX组件之间的联系.接下来我 ...
- GK2023游记
不会有人高考之后二十多天才更博客吧...(写的很烂,单纯想补个坑) 大概就是写一下纯 whk 的高三生活,是不是流水账无所谓,就算当个记录了 高三生活开头就不太平,高三的班主任和高二一样(姑且叫他 田 ...