一. 背景
        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. MongoDB七-运维技术

    复制来自:http://www.cnblogs.com/huangxincheng/archive/2012/03/08/2384571.html 这一篇我们以管理员的视角来看mongodb,作为一名 ...

  2. vant库在vue全局引入toast组件

    第一步: 在config中引入 // 全局引入vant的提示框 import { Toast } from "vant"; Vue.use(Toast); 第二步: 在组要的.vu ...

  3. 第十九篇 同源策略与Jsonp

    同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的 ...

  4. 【剑指Offer】面试题06.从尾到头打印链表

    题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 1000 ...

  5. Linux用户管理 权限管理 内存管理 网络管理命令 (第四天)

    默认添加的用户会自动加入和用户名一样的组中su 切换用户查看当前登陆的用户: whoami id`查看当前用户属于哪个组:groupsgroupadd 组名 添加组groupdel 组名 删除组gre ...

  6. UVA - 1647 Computer Transformation(计算机变换)(找规律)

    题意:初始串为一个1,每一步会将每个0改成10,每个1改成01,因此1会依次变成01,1001,01101001,……输入n(n<=1000),统计n步之后得到的串中,"00" ...

  7. Ubuntu 14.04 搭建 ftp

    一.安装ftp服务器vsftpd $sudo apt-get update $sudo apt-get install vsftpd ftp服务器使用21端口,安装成功之后查看是否打开21端口 $ s ...

  8. 从谷歌Pixel3不堆硬件看智能手机下一个十年将被AI制霸

    别看现在的智能手机行业热闹异常--厂商混战.新品频出.噱头涌现,但能引领手机行业发展趋势的依旧是苹果和谷歌.如果说苹果的iPhone树立了一个个智能手机行业进化的标杆,那么谷歌其实就是在为安卓手机的发 ...

  9. vue插件汇总

    浏览了一下,确实不错,另补充以下几个插件(欢迎大家将自己使用的插件留言给我,共同进步): vue-orgchart  可编辑,可导出 JSON 的树形组织图 的VUE组件 viewerjs  强大的图 ...

  10. JAVAEE 和项目开发(第六课:服务器的安装和目录介绍和闪退解决办法)

    课程介绍: 在学习了 HTTP 协议后,我们对浏览器和服务器的交互流程以及规范有了一定程度的认知,并也有了自己的理解.但是不少同学对服务器的概念还是有些模糊的,那么本节课就针对服务器进行介绍,我们一起 ...