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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 看到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=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.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=adminspring.datasource.druid.stat-view-servlet.login-password=admin

此时重启项目,访问localhost:8080/druid/login.html,输入上面配置的用户名和密码便可登录管理后台。image.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

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

再来点感想

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

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


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
27天前
|
druid Java Maven
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
289 6
|
4月前
|
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. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
367 4
|
3月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
333 0
|
4月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
318 1
|
5月前
|
消息中间件 Java Kafka
springboot集成kafka
springboot集成kafka
168 2
|
4月前
|
消息中间件 Java Kafka
Spring Boot与Apache Kafka Streams的集成
Spring Boot与Apache Kafka Streams的集成
|
4月前
|
消息中间件 Java Kafka
Spring Boot与Apache Kafka集成的深度指南
Spring Boot与Apache Kafka集成的深度指南
|
4月前
|
消息中间件 Java Kafka
Spring Boot与Kafka的集成应用
Spring Boot与Kafka的集成应用

热门文章

最新文章