一. 背景
        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. 118-PHP调用带参数的成员方法

    <?php class ren{ //定义人类 public function info($name,$age=3){ //定义有两个参数的成员方法 echo "我是{$name},年 ...

  2. 103-PHP定义一个类

    <?php class ren{ //定义人类 } class mao{ //定义猫类 } new ren(); //实例化人类 new mao(); //实例化猫类 new mao(); // ...

  3. XML 之 语法详解

    一.文档规则 .区分大小写. .属性值必须加引号(单引号.双引号都可以),一般情况下建议使用使用双引号. .所有标记必须有结束符号. .所有空标记必须关闭. .必须有且仅有一根元素. .解析空白字符时 ...

  4. UVA - 11134 Fabled Rooks(传说中的车)(贪心)

    题意:在n*n的棋盘上放n个车,使得任意两个车不相互攻击,且第i个车在一个给定的矩形Ri之内,不相互攻击是指不同行不同列,无解输出IMPOSSIBLE,否则分别输出第1,2,……,n个车的坐标. 分析 ...

  5. 自定义css

    /** * 重写FrozenUI */ /** * 按钮 */ body { background-color: #F2F2F2; } @media screen and (-webkit-min-d ...

  6. 用Python读取一个文本文件并统计词频

    刚刚在写文章时360浏览器崩溃了,结果内容还是找回来了,感谢博客园的自动保存功能!!! ------------恢复内容开始------------ 最近在学习Python,自己写了一个小程序,可以从 ...

  7. Day 3:集合

    数组: 存储同一种数据类型的集合容器数组的特点: 1. 只能存储同一种数据类型的数据. 2. 一旦初始化,长度固定.  3. 数组中的元素与元素之间的内存地址是连续的. 注意: Object类型的数组 ...

  8. (简单模拟)P1003 铺地毯

    题解: 从最后一个输入的数据开始排查,如果说你找到了这个点上面有地毯,那么就直接输出这个值,如果没找到就按照题干的意思输出-1. #include<iostream>#include< ...

  9. MFC 打开Jpg文件

    UpdateWindow(); int height, width; CRect rect;//定义矩形类 CRect rect1; CImage image; //创建图片类 image.Load( ...

  10. UVA 11552 序列划分模型 状态设计DP

    这个题目刚看到还真不好下手,把一个是 k的倍数的长度的字符串分成len/k块,每块是k个字母,每个块可以重新组合,最后使得整个序列的相同字母尽量在一起,也就是说,最后会把序列从前往后扫,相连的相同字母 ...