都说尽量不要在外包团队待太久,事实会告诉你一点都不假。最近接手外包团队的项目,发现很多问题。最令人难以接受的便是在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

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

springboot-druid

登录后台之后如上图,然后点击图中的“数据源”。

springboot-druid

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

除了最大连接数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

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

springboot-druid

怎么发现此问题的?

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

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

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

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

# 初始化连接数大小
spring.datasource.druid.initial-size=0

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

再来点感想

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

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



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

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2020/10/21/springboot-druid/