网站首页 > 博客文章 正文
前言
项目上新功能需要连接多个数据库,项目是用Spring Boot开发的,因为平时习惯了配置文件一把梭,所以花了点时间总结了一下Spring Boot项目配置多数据源的方法;
因为项目中常用JdbcTemplate和Mybatis,所以又研究了一下在多数据源的情况下的集成方法;
接着又心血来潮顺带了解了一下Spring Boot各版本默认的数据库连接池分别是什么;
最后我又对比了一下Spring Boot 2.x版本默认的HikariCP连接池与阿里开源的Druid连接池,总结了各自的特性以及适用场景。
目录
- Spring Boot如何配置多数据源?
- 多数据源的情况下如何集成JdbcTemplate和Mybatis?
- Spring Boot各版本默认的数据库连接池分别是什么?
- HikariCP与Druid,该如何选择?
Spring Boot如何配置多数据源?
Spring Boot推崇“约定大于配置”,当项目只需要连接一个数据库时,我们只需要在配置文件里简单配置上数据库连接信息就可使用。
但是当项目需要连接多个数据库时我们要怎么做呢?
操作步骤:
1、在配置文件中分别配置好两个数据库的连接信息:
2、新建一个Java配置类配置数据源信息:
- @Configuration注解表明DatasourceConfig类是一个配置类;
- 使用@Bean注解分别定义了名为firstDatasource和secondDatasource的两个bean;
- 使用@ConfigurationProperties注解分别绑定配置文件中以spring.datasource.first和spring.datasource.second开头的属性;
多数据源的情况下如何集成JdbcTemplate和Mybatis?
在实际项目中我们操作数据库通常会使用封装好的工具或者ORM框架,这里我就以比较常用的JdbcTemplate和Mybatis为例,看一下在多数据源的情况该怎么集成。
集成JdbcTemplate
操作步骤:
1、首先看一下新建一个JdbcTemplate对象需要什么参数:
通过查看源码我们得知新建一个JdbcTemplate对象需要一个数据源DataSource参数。
2、新建一个Java配置类,用来配置JdbcTemplate信息:
- 使用@Bean注解分别定义了名为firstJdbcTemplate和secondJdbcTemplate的两个bean;
- 使用@Qualifier注解分别注入不同的数据源bean;
3、怎么使用这两个JdbcTemplate呢?
由于两个JdbcTemplate在同一个Spring容器中,所以在使用@Autowired注解注入bean时最好配合@Qualifier注解一起使用,或者可以直接使用@Resource注解并指定bean名称。
集成Mybatis
操作步骤:
1、使用Mybatis插件生成数据库表对应的Mapper文件和xml文件,分别存放到不同的目录下。
2、Mybatis中有一个十分重要的概念——SqlSessionFactory,它是配置Mybatis的关键所在:
几个关键点:
- 通过@MapperScan注解配置需要扫描的Mapper文件的路径;
- 创建SqlSessionFactory bean,并设置数据源、xml文件路径;
- 创建数据源对应的事务控制器;
- 创建一个SqlSessionTemplate bean(主要为了方便我们手动调用);
3、在多数据源的环境下直接调用Mapper并不需要额外的配置,正常注入Mapper接口就可以了。
特别注意:在通过Service层的方法来调用Mapper接口并且启用了事务管理的情况下,我们必须手动指明事务控制器的名称。
Spring Boot各版本默认的数据库连接池分别是什么?
因为项目中一直在使用阿里开源的Druid连接池,所以有点好奇Spring Boot默认使用的是什么连接池?
其实只要仔细观察,在启动项目的时候我们就可以看出点端倪:
可以看到:Spring Boot默认使用的数据库连接池叫HikariDataSource。
这个HikariDataSource是什么时候冒出来的?我决定去源码里寻找答案。
不知道从哪开始的话就从Spring Boot的核心配置文件spring.factories文件开始吧,准没错!
果然发现了自动加载数据源的配置——DataSourceAutoConfiguration,进去看一下:
我发现该配置文件通过@Import注解导入了Hikari、Tomcat、Dbcp2、Generic(泛型)以及一个用于JMX监控的数据源配置。
再来看一下Hikari的配置:
由于Hikari的配置被放到了第一个位置,根据条件当容器中不存在DataSource类型的bean时,Spring Boot就会首先去尝试加载HikariDataSource,如果加载成功那么后面Tomcat、Dbcp2等都不会再去加载,这个加载逻辑正好也映证了上面Spring Boot默认使用的数据库连接池叫HikariDataSource的结论。
那么Spring Boot是从哪个版本开始将HikariDataSource作为默认的数据库连接池的呢?
对比一下Spring Boot 1.x的最后一个版本——1.5.22.RELEASE,DataSourceAutoConfiguration配置文件中排在首位的是Tomcat连接池:
也就是说Spring Boot 1.x版本默认使用的是Tomcat连接池,从2.0版本开始Spring Boot默认的数据库连接池换成了HikariCP。
HikariCP与Druid,该如何选择?
这个HikariCP能被Spring Boot官方选为默认数据库连接池,必定是有点东西的;而阿里开源的Druid同样是一个非常热门的数据库连接池,那么这两种连接池我们到底该怎么选择呢?
1、HikariCP
通过github上的项目主页我们可以看到HikariCP是一个非常热门的项目,目前有12.7K的star,HikariCP以简单、可靠、高性能的特性著称。
项目主页有一张HikariCP与其他几个连接池的性能对比图:
从图上可以看出HikariCP的性能确实比c3p0、dbcp2、tomcat等老牌连接池高出一大截!
Spring Boot官方选择HikariCP作为默认的数据库连接池也正是看中它的高性能特点吧。
2、Druid
Druid在github上有20.8K的star,项目主页介绍Druid是Java语言中最好的数据库连接池,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。
放一张Druid与其他主流连接池的对比图:
可以看到,从性能、稳定性、扩展、监控、安全等方面综合比较,Druid比其他连接池更优秀。
HikariCP追求的是极致的高性能,单从性能来讲可能比Druid更加优秀,如果项目追求极致的数据库连接性能,可以考虑HikariCP。
通常来讲,连接池本身的性能消耗在整个调用链路中占比不大,而是否支持LRU的方式重用、是否支持PSCache(PreparedStatementCache)才是连接池性能的关键点,这两方面Druid完胜HikariCP。
其次Druid连接池在阿里内部已经经过历年双十一超大规模并发验证,足以证明其稳定性。
此外Druid连接池本就是为监控而生,天生自带非常强大的监控功能,能采集非常完备的连接池执行信息,包括SQL执行、并发、慢查询、执行时间区间分布等,这对项目运维非常有用。
从实际应用场景考虑,我认为Druid连接池是一个更好的选择。
“分享干货,收获快乐”
我是一名Java程序员,喜欢我的文章欢迎 关注 及 转发,我会经常与大家分享工作当中的实用技巧与经验。
猜你喜欢
- 2024-10-17 SpringBoot+Vue3+MySQL集群 开发健康体检双系统(完结)
- 2024-10-17 再有人问你数据库连接池的原理,这篇文章甩给他!
- 2024-10-17 详解Spring Boot并发处理能力:理论与参数设置实践
- 2024-10-17 数据库连接池有什么用?springboot中如何使用?
- 2024-10-17 谈谈高并发系统的一些解决方案(高并发系统设计的三大目标)
- 2024-10-17 微服务事务管理艺术:Spring Boot 集成 Seata 深度指南
- 2024-10-17 阿里巴巴开源数据库jdbc连接池 Druid 1.1.18 发布
- 2024-10-17 【架构之路】提升后端接口性能的实战技巧
- 2024-10-17 「解密」有人要将“高并发”拉下“神坛”!
- 2024-10-17 MySQL连接优化是数据库性能调优的重要一环
你 发表评论:
欢迎- 372℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 369℃用AI Agent治理微服务的复杂性问题|QCon
- 360℃初次使用IntelliJ IDEA新建Maven项目
- 352℃Maven技术方案最全手册(mavena)
- 349℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 348℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 346℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 344℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)