Druid多数据源情况下的数据库重连问题
Druid多数据源情况下的数据库重连问题
上⼀篇踩坑⽇记写完之后,⾃⼰反复读了⼏遍,感觉读起来有点怪怪的,也许是因为⾃⼰做程序员久了,⼝头表达的次数也少了,所以很明显感觉到⾃⼰有时候说话不那么顺溜了,想当年我随随便便就可以⼝若悬河,滔滔不绝(哈哈哈,开玩笑)。所以为了让⾃⼰的⽂章看起来更加简介明了,⼜让有机会读到这些⽂章的朋友们能够⾮常快速的理解我遇到的情况,和怎么样解决的。所以以后我打算我的踩坑⽇记使⽤来描述,其实在答辩或者⾯试的过程中,⼤家也可以使⽤SATR法则来描述⾃⼰的项⽬等。接下来,我们进⼊今天的正题。
情境(situation):
在⽣产环境中,数据库密码是托管在公司改造后的disconf上(不是直接存储在properties⽂件),然后数据库密码托管程序每过⼀段时间,机会进⾏数据库密码的校验,所以应⽤会有数据库长链接⼀直存在。然后有⼀天,运维在晚上没有业务流量的时候,进⾏了数据库的主备切换。这个过程中,会产⽣短暂的数据库连接不可⽤,数据库密码托管程序会报错,因为数据库连接连不上了。当主备切换完成后,数据库恢复正常,数据库密码托管程序也恢复了正常,但是发现应⽤的数据库连接池获取连接的时候,⼀直报错。我们数据库连接池配置使⽤的是,它提供了数据库重连机制,但是在我们⽣产环境中,却没
有⽣效。
任务(task):
druid连接池配置详解从上⾯我们知道,数据库连接池⼯具是提供了重连机制的,但是为什么我们的重连没有⽣效,接下来的任务就是寻⽣产环境中数据库连接池重连失败的原因。
⾏动(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的获取连接的过程,下⾯的图是从其他地⽅抄过来的,如有侵权,请联系我删除。
今天的踩坑⽇志就到这⾥,如果⼤家对我的⽂章有什么问题或者建议,欢迎评论或者私信我,⼤家⼀起进步。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论