前言
都说尽量不要在外包团队待太久,事实会告诉你一点都不假。最近接手外包团队的项目,发现很多问题。最令人难以接受的便是在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,输入上面配置的用户名和密码便可登录管理后台。其他选项我们暂且不看,只看初始化连接大小、最小空闲连接数以及最大连接数三项。此时,你看到坑有多大了吗?
除了最大连接数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
配置完成,再次启动,可以看到相应的参数和配置文件内的一致了。
怎么发现此问题的?
其实发现此问题是解决其他并发症而找到的。接手的项目中引入了logback、log4j、log4j2等多个日志框架,是否混乱,于是决定改造。
但在改造日志框架时出现了奇怪的想象:程序启动了,但却无法访问,也没异常日志输出。
起初还以为是日志框架哪里配错了。最后经过各种分析尝试,发现是数据库连接地址错误了。但正常来说,数据库连接错误,启动时应该直接抛出异常的啊,为什么没有?
只用把配置项中的initial-size值改为0,你大概就知道为什么了。
# 初始化连接数大小 spring.datasource.druid.initial-size=0
initial-size改为0之后,初始化连接数为0,就不会去尝试连接数据库了,当然也就不会抛出初始化时连接数据库的异常了。
再来点感想
当你看了一团糟的代码,想在此基础上进行修改、重构,你会发现几乎比重写一个项目都费劲。
最后说一条对本人影响很大的建议:遇到问题别回避,刨根问底的追一追,收获到的知识远比问题本身更有价值。