看到SpringBoot神一样集成Druid,我吐了!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 看到SpringBoot神一样集成Druid,我吐了!

原文首发于公众号:程序新视界,欢迎关注。


都说尽量不要在外包团队待太久,事实会告诉你一点都不假。最近接手外包团队的项目,发现很多问题。最令人难以接受的便是在SpringBoot集成Druid数据库连接池时的配置,直接废掉,很无语。


在写这个坑之前,还是说一下外包团队一个严重的弊端。为了赶工期,团队自身和甲方都不能够很好的保证代码质量。当劣质代码泛滥,又遇上Ctr+C和Ctr+V,救都救不过来。


待久了,想写优质代码都难。同时,又有一大堆烂代码等着你去“学”和“抄”,所以有机会赶紧跳出这个恶性循环。


好了,吐槽和提醒完毕,下面来回顾一下SpringBoot集成Druid时埋下的坑,轻易还真发现不了。


SpringBoot集成Druid错误示例

Druid官方提供了对应的starter,因此在SpringBoot中集成Druid数据源连接池还是比较简单的,主要就是依赖文件的引入和配置文件的配置。


首先引入以下4个依赖:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库连接相关-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!--Druid数据库连接池集成-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

上面依次引入了SpringBoot对Web项目、jdbc、mysql数据库驱动和druid集成的依赖。

然后便是配置文件,可以先根据经验判断一下下面的配置文件有什么问题。

spring.datasource.url=jdbc:mysql://localhost:3306/spring?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8\
  &useSSL=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

其实,单看上面的配置项都是正确的,配置了url、用户名、密码、驱动类,也指定了数据源的类型为DruidDataSource。


此时项目也能够正常启动,业务也能够正常运行。那么,前文所说的坑在哪里呢?


来找一找坑

为了找到其中的坑,我们再在配置文件中添加一些配置项,来开启Druid提供的监控后台。


# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
#是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
spring.datasource.druid.stat-view-servlet.enabled=true
# 监控后台账号和密码
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

image.pngimage.png其他选项我们暂且不看,只看初始化连接大小、最小空闲连接数以及最大连接数三项。此时,你看到坑有多大了吗?


除了最大连接数Druid给了默认值8,还算凑合。其他的两个都为0。连接池的作用不就是先建立一部分可以随用随取的连接吗?现在的确用了连接池,但初始化连接大小和最小空闲连接数全为0。配置和没配置有什么区别?


知道了问题的根源,解决问题的方法就简单了,在配置文件中对连接池进行基本的配置,此处可根据项目情况进行具体值的调整,下面为具体示例:


# 连接池配置
# 初始化连接数大小
spring.datasource.druid.initial-size=3
# 最小连接数
spring.datasource.druid.min-idle=3
# 最大连接数
spring.datasource.druid.max-active=10
# 连接超时时间
spring.datasource.druid.max-wait=60000

配置完成,再次启动,可以看到相应的参数和配置文件内的一致了。

image.png怎么发现此问题的?

其实发现此问题是解决其他并发症而找到的。接手的项目中引入了logback、log4j、log4j2等多个日志框架,是否混乱,于是决定改造。


但在改造日志框架时出现了奇怪的想象:程序启动了,但却无法访问,也没异常日志输出。


起初还以为是日志框架哪里配错了。最后经过各种分析尝试,发现是数据库连接地址错误了。但正常来说,数据库连接错误,启动时应该直接抛出异常的啊,为什么没有?


只用把配置项中的initial-size值改为0,你大概就知道为什么了。


# 初始化连接数大小

spring.datasource.druid.initial-size=0

1

2

initial-size改为0之后,初始化连接数为0,就不会去尝试连接数据库了,当然也就不会抛出初始化时连接数据库的异常了。


再来点感想

当你看了一团糟的代码,想在此基础上进行修改、重构,你会发现几乎比重写一个项目都费劲。


最后说一条对本人影响很大的建议:遇到问题别回避,刨根问底的追一追,收获到的知识远比问题本身更有价值。



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
5月前
|
druid Java 关系型数据库
Spring Boot与Druid升级解决方案
好的,我需要帮助用户解决他们遇到的数据库连接问题,并升级项目的依赖。首先,用户提供的错误信息是关于Spring Boot应用在初始化数据源时抛出的异常,具体是Druid连接池验证连接失败。同时,用户希望升级项目的依赖版本。
465 10
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
7月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
12月前
|
druid Java Maven
|
11月前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
324 0
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
972 6
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
867 4
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
1039 1
|
消息中间件 Java Kafka
springboot集成kafka
springboot集成kafka
403 2