Druid数据库链接池获取链接阻塞(转载)

一. 背景
        17年公司有个项目组在南京作项目的时候,开发框架用的是spring boot ,数据库链接池用的是druid,但总是遇到socket read timeout的错误,不得已放弃了druid而改用了tomcat数据库链接池,问题获得解决,也就没有深刻找druid的缘由了(按理说牛掰的druid不该该啊)。html

         时间到了18年,我所在的项目组到了安徽马鞍山,其中接口平台项目(SpringBoot动态配置多数据源-从数据库读取链接信息)竟然也遇到了这个问题(这个项目已在多个地市正常使用,难道是因为马鞍山跟南京挨得太近被传染了吗!),程序动不动就阻塞几十分钟(时间不定),形成客户端长时间等待来一个报错消息。此次咱们没有回避这个问题,不管如何要搞定它。spring

二. 解决问题
        巧的是咱们的合做公司,他们的项目已经上线一年多了,常常是隔个几天也遇到这个问题,他们的作法是重启整个项目(这样客户体验真的好吗???不能苟同啊)。我先是调试了程序,发现就是在运行connection = druidDataSource.getConnection();这句代码(从数据库链接池取一个链接)的时候,程序就阻塞在这里不动了,我把问题拿到网上搜索了一番,初步怀疑是下面两个缘由之一:sql

网络抖动(网络不稳定、闪断)形成的(由于我在使用svn同步项目的时候,常常因为网络问题同步失败);
防火墙把个人socket链接断开了(由于个人应用服务器和数据库服务器之间有一个防火墙)。
针对缘由1,我按照网上的说法(https://blog.csdn.net/supper10090/article/details/79622397?utm_source=blogxgwz3)作了配置,惋惜问题还健在。因此我就怀疑是缘由2(https://www.2cto.com/database/201505/402016.html)了,找来防火墙的安装公司一查,人家说并无这个配置。。。大写的尴尬。一不当心进入了小小的迷茫。。。在我静一静以后,找到了这篇文章:https://www.cnblogs.com/trust-freedom/p/6992952.html,在文章的最后,发现了契机,各位小伙伴本身去读读吧,能学到很多东西!数据库

        最终,我结合缘由1与2的解决方式,得出问题解决办法:tomcat

         第一步:druidDataSource.setConnectionProperties("oracle.net.CONNECT_TIMEOUT=6000;oracle.jdbc.ReadTimeout=30000"); //后面的ReadTimeout单位也是毫秒,不要设置的过短,不然有些sql执行时间原本就长,报错会影响正常使用服务器

         第二步:网络

druidDataSource.setMinEvictableIdleTimeMillis(180000); //配置一个链接在池中最小生存的时间,单位是毫秒,这里配置为3分钟180000
druidDataSource.setKeepAlive(true); //打开druid.keepAlive以后,当链接池空闲时,池中的minIdle数量之内的链接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操做,即执行druid.validationQuery指定的查询SQL,通常为select * from dual,只要minEvictableIdleTimeMillis设置的小于防火墙切断链接时间,就能够保证当链接空闲时自动作保活检测,不会被防火墙切断oracle

        socket超时致使程序阻塞的问题再也没有出现!以上我是经过代码实现的,你们能够经过配置文件实现。框架

PS: 对于直接把数据源写死在项目中,这个问题出现的频率不高(但会出现),但因为个人项目数据源是动态配置的,这个问题出现的特别频繁(为何这么频繁呢?我也不知道了)

dom

转载地址:https://blog.csdn.net/aiyo92/article/details/86540647

相关文章
相关标签/搜索