数据库是MySql。
这个报错目前在生产线上两年来遇到了两次,一次是Dba那边问题数据库down了。导致数据库连不上。
然后偶尔出现了一次这个提示,但数据库并没有挂的。在测试和用户环境也出现了多次,虽然都没影响到业务,但总觉得会是个雷,最近相对有点空余,就研究了下druid的配置,姑且总结下非数据库宕机可能导至连接失败的原因。
1、mysql数据库有两个参数配置:interactive_timeout、wait_timeout。默认是8小时,意思是你的应用与数据库建立的连接如果8小时都没有用过,数据库会将连接删除。druid数据库连接池并不知道这个事,它可能还拿着这个失效的连接在8小时后想用起来,那么标题的报错就出来了。
2、druid的配置有处理这种情况的参数,一是在每次使用连接前做个校验看下这个连接是否被数据库删掉了;二是设置定时任务定时删除空闲的连接。核心参数是:
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
# 这个参数两个作用:
# 1、每隔5分钟删除空闲了5分钟(minEvictableIdleTimeMillis)且空闲连接数大于minIdle的空闲连接,如果空闲了15分钟(maxEvictableIdleTimeMillis)分钟的连接则直接删除
# 2、建立连接申请时,判断连接是否空闲了5分钟以上,是的话执行validationQuery 验证连接是否有效 ,无效则删除连接
timeBetweenEvictionRunsMillis: 300000
我生产第二次出现标题所示错误的原因可能是我没开【validationQuery】,请先看我最新生产的配置:
现在我加上了【validationQuery】,我直接根据参数陈述下我的配置逻辑:数据库连接池启动时,初始化10个连接数【initialSize】,空闲的最小连接数10个【minIdle】,最大的活动连接数是100,业务要用到数据库连接时获取连接的超时时间是5分钟【maxWait】,
驱逐的运行间隔时间是5分钟【timeBetweenEvictionRunsMillis】,
最小驱逐空闲连接的时间5分钟【minEvictableIdleTimeMillis】,
最大驱逐空闲连接的时间15分钟【maxEvictableIdleTimeMilis】,
校验连接是否有效【validationQuery】,当有空闲连接时获取连接是否要校验【testWhileIdle】。
为什么没开validationQuery呢?可能是注释它做测试忘记将注释去掉了,但即使没开,讲道理
因为有timeBetweenEvictionRunsMillis这个参数在,不开校验查询,也只是会让timeBetweenEvictionRunsMillis失去它的作用2,它的作用1定时删除空闲的连接应该还有效的吧。
有效的情况下什么连接能空闲8小时而不被删除,导致报了这个连接失败的异常?有这个maxEvictableIdleTimeMilis参数,即使空闲连接不超过minIdle的10个,空闲的时间超过15分钟就会被干掉才对啊。
我本地分别调低了这些参数做测试,是有效的。我将上图所有的参数都在本地验证了一遍,追了源码在对应这些参数源码处作了断点。没毛病。
好了,没办法,倒是对【validationQuery】有了新的认知,我的druid版本是1.2.8。初初没看源码,我以为他的作用是获取连接时,校验连接有没有被数据库删除,没有就用,有就跳过。看了源码才知道,它的作用不止判断连接被数据库删除跳过,跳过它还顺便把druid连接池的这个连接也删掉了。所以干脆又把这个开关开了。在获取连接时就对无效的进行删除,总不会还报连接异常了吧?文章来源:https://www.toymoban.com/news/detail-706720.html
我生产的标题报错我更倾向于认为它可能那一瞬的确是数据库方面出了抖动问题。配置没啥大问题,现在把【validationQuery】加上如果再有,那应该是数据库问题无疑了,如果没有那到时再来追下这个配置是哪里配得有问题,或者看官大大能给到意见那是更好。文章来源地址https://www.toymoban.com/news/detail-706720.html
到了这里,关于com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!