Druid多数据源情况下的数据库重连问题

Druid多数据源情况下的数据库重连问题

上一篇踩坑日记写完之后,自己反复读了几遍,感觉读起来有点怪怪的,也许是因为自己做程序员久了,口头表达的次数也少了,所以很明显感觉到自己有时候说话不那么顺溜了,想当年我随随便便就可以口若悬河,滔滔不绝(哈哈哈,开玩笑)。所以为了让自己的文章看起来更加简介明了,又让有机会读到这些文章的朋友们能够非常快速的理解我遇到的情况,和怎么样解决的。所以以后我打算我的踩坑日记使用STAR法则来描述,其实在答辩或者面试的过程中,大家也可以使用SATR法则来描述自己的项目等。接下来,我们进入今天的正题。

情境(situation):
在生产环境中,数据库密码是托管在公司改造后的disconf上(不是直接存储在properties文件),然后数据库密码托管程序每过一段时间,机会进行数据库密码的校验,所以应用会有数据库长链接一直存在。然后有一天,运维在晚上没有业务流量的时候,进行了数据库的主备切换。这个过程中,会产生短暂的数据库连接不可用,数据库密码托管程序会报错,因为数据库连接连不上了。当主备切换完成后,数据库恢复正常,数据库密码托管程序也恢复了正常,但是发现应用的数据库连接池获取连接的时候,一直报错。我们数据库连接池配置使用的是Druid,它提供了数据库重连机制,但是在我们生产环境中,却没有生效。

任务(task):
从上面我们知道,数据库连接池工具是提供了重连机制的,但是为什么我们的重连没有生效,接下来的任务就是寻找生产环境中数据库连接池重连失败的原因。

行动(action):
首先第一步,我们知道Druid数据库连接池是有很多参数来控制连接池的各种功能是否生效,所以首先应该查看连接池本身的参数配置是不是对的。经过查找和比对,我们数据库连接池的配置是完全支持数据库重连的,同样的配置我在本地开发环境进行了测试,通过手工起/停数据库来模拟数据库故障,发现配置项上没有什么问题。

然后第二步,查看Druid的版本,我们使用的是Druid 1.0.6,版本相对较低,在Druid升级1.0.11版本日志中的有提到过数据库重连的问题,同时询问了我们临近系统他们使用的Druid版本为1.0.31,他们的数据库重连是生效的。所以我就将我的Druid版本升级为1.0.31和其他系统对齐,然后进行测试,发现还是不行。

第三步,在配置项和版本好都对齐之后,两个系统表现出来的数据库重连结果确是大相径庭,此时毫无头绪,只能硬着头皮一个配置项一个配置项的对比,因为怕是某个粗心的操作,配置项在代码中写错了。当在比对时,发现了另外一个问题,之前测试配置的那个系统的数据源只有一个,但是出问题的系统数据源却有两个,虽然两个数据源配置的数据库是同一个。经过和同事确认,得知其中一个数据源是本地缓存专用的数据源,因为公司内部提供的本地缓存实现参数是固定的,也就是在数据源配置前面加了特定参数,如XXX.driver、XXX.url。而前一个数据源是项目开始时使用的,后面这个本地缓存的数据源则是后面增加的。了解了这个情况的时候,我准备把前面的数据源先屏蔽掉,将后面的本地缓存的数据源替换掉前面的数据源,因为两个数据源数据库连接信息是一样的。再屏蔽了一个数据源之后,我再重试了一下数据库重连,发现重连生效了。

结果(result):
经过不停的尝试,最终解决了这个问题,生产上的版本还是升级成1.0.31。同时在这个过程中,也有一些思考,就是在系统依赖升级的这个问题上,系统再经过长时间运行之后,如果系统应为依赖出现问题时,确定要升级依赖,需要注意依赖是否是向后兼容的,并不是所有依赖都会做的那么完美。同时,在解决问题的过程中,也跟踪了一下Druid的代码,了解了Druid的获取连接的过程,下面的图是从其他地方抄过来的,如有侵权,请联系我删除。
Druid多数据源情况下的数据库重连问题_第1张图片

今天的踩坑日志就到这里,如果大家对我的文章有什么问题或者建议,欢迎评论或者私信我,大家一起进步。

你可能感兴趣的:(踩坑日记)