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

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

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

网络抖动(网络不稳定、闪断)造成的(因为我在使用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的解决方式,得出问题解决办法:

第一步: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设置的小于防火墙切断连接时间,就可以保证当连接空闲时自动做保活检测,不会被防火墙切断

socket超时导致程序阻塞的问题再也没有出现!以上我是通过代码实现的,大家可以通过配置文件实现。

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

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

Druid数据库连接池获取连接阻塞(转载)的更多相关文章

  1. Druid数据库连接池源码分析

    上一篇文章重点介绍了一下Java的Future模式,最后意淫了一个数据库连接池的场景.本想通过Future模式来防止,当多个线程同时获取数据库连接时各自都生成一个,造成资源浪费.但是忽略了一个根本的功 ...

  2. Druid数据库连接池的使用

    Druid  阿里提供的数据库连接池,集以上连接池优点于一身,开发使用此连接池 使用配置文件方式获取Druid数据库连接池 TestDruid package com.aff.connection; ...

  3. Druid数据库连接池基本使用

    一.导入Druid的jar包和数据库驱动jar包 二.定义配置文件 与c3p0不同,Druid的配置文件是properties形式的.而且Druid不像c3p0那样可以自动加载配置文件,Druid需要 ...

  4. springboot druid 数据库连接池连接失败后一直重连

    在使用个人阿里云测试机,在查询实时输出日志时,看到数据库连接失败后,服务器一直在重连服务器.开始以为是遭受重复攻击,后面把服务重启后,就没有出现一直重连的情况.看以下输出日志: 2022-02-09 ...

  5. Druid数据库连接池配置

    DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...

  6. Spring Boot [使用 Druid 数据库连接池]

    导读 最近一段时间比较忙,以至于很久没有更新Spring Boot系列文章,恰好最近用到Druid, 就将Spring Boot 使用 Druid作为数据源做一个简单的介绍. Druid介绍: Dru ...

  7. Druid数据库连接池就这么简单

    前言 本章节主要讲解Druid数据库连接池,为什么要学Druid数据库连接池呢?? 我的知识储备数据库连接池有两种->C3P0,DBCP,可是现在看起来并不够用阿~当时学习C3P0的时候,觉得这 ...

  8. Druid 数据库连接池

    druid 数据库连接池 由阿里提供 步骤 1 导包 durid1.0.9 jar 包 2 定义配置文件 必须是 properties文件 名字任意 位置也任意 3 获得数据库连接池对象 通过 Dur ...

  9. 阿里druid数据库连接池配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

随机推荐

  1. 035-PHP简单定义一个闭包函数

    <?php /* + 什么是闭包函数?即一个函数内部,包含了1-N个匿名函数, + 用处是可以做局部数据缓存与实现封装(有点类似class) */ # 函数内部,定义一个匿名函数,即可称为闭包函 ...

  2. 自定义spark UDAF

    官网链接 样例代码: import java.util.ArrayList; import java.util.List; import org.apache.spark.sql.Dataset; i ...

  3. 对于python 3.x与python2.x中新型类的继承特性总结

    (1)一般性继承特性 """ 该文件对于python 3.x 及python 2.x的New-style 类的一般性继承特性进行了说明和测试. (1)实例的继承特性:搜寻 ...

  4. 使用UltraISO(软碟通)制作U盘制作启动盘完整教程

    背景:服务器需要安装系统,但是没有启动盘只有镜像. 前提:U盘和安装镜像准备好 步骤一:首先我们先安装软碟通,完成安装后打开软碟通,文件->打开,打开我们需要制作的iso镜像.如下图(也可下本地 ...

  5. 第二十一篇 关联管理器(RelatedManager)

    关联管理器(RelatedManager) lass RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: Forei ...

  6. SpringAOP 使用注解的简单使用

    1. 导入jar包 /SpringAOPmy/lib/com.springsource.net.sf.cglib-2.2.0.jar/SpringAOPmy/lib/com.springsource. ...

  7. PHP实现简单的双色球机选号码

    <?php header('Content-Type: text/html; charset=utf-8'); //PHP实现双色球机选号码 $red = range(1, 33);//初次设定 ...

  8. 简单看看LongAccumulator

    上篇博客我们看了AtomicLong和LongAdder的由来,但是有的时候我们想一下,LongAdder这个类也有点局限性,因为只能是每一次都+1,那有没有办法每次+2呢?或者每次乘以2?说得更抽象 ...

  9. MVC学生管理系统-阶段IV(修改学生信息)

    项目源码 :https://download.csdn.net/download/weixin_44718300/11091042 前期准备,主体框架, 学生列表显示  请看阶段一文章 添加学生信息 ...

  10. Tensorflow学习教程------代价函数

    Tensorflow学习教程------代价函数   二次代价函数(quadratic cost): 其中,C表示代价函数,x表示样本,y表示实际值,a表示输出值,n表示样本的总数.为简单起见,使用一 ...