一. 背景
        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. java如何连接Oracle数据库问题

    Oracle数据库纯属自学,不对请留言改正! 在学Oracle前相信已经大致知道mysql或sqlserver数据库,这个跟前面两个不大一样,你安装的时候让你输入一个密码,貌似是一个系统管理员密码,跟 ...

  2. junit基础学习之-测试controller层(2)

    准备工作: eclipse本身带有junit4,可以直接build path,加入junit. 连接数据库的配置文件需要修改,之前的文件是采用properties+xml文件的形式,但是在测试的时候因 ...

  3. C# NPOI的数据批量导入数据库

    public ActionResult Upload(HttpPostedFileBase Namefile)        {            //判断文件是否存在            if ...

  4. Kali链接Xshell和更新源

    一.Xshell首次链接kali系统中的ssh Xshell:帮助我们去连接各种服务平台,方便管理服务器,链路可以加密处理(ssh/vsftp) 1.开启kali中的ssh服务,service ssh ...

  5. java String字符串判断

    判断空字符串:StringUtils.isBlank StringUtils.isBlank(null) = true StringUtils.isBlank("") = true ...

  6. vue-cli3.x 搭建项目目

    安装文档 https://cli.vuejs.org/zh/guide/ 安装条件 npm 更至最新 node >=8.9 可以用npm -v 查看npm的版本号 1.关于旧版本 Vue CLI ...

  7. [CISCN 2019 初赛]Love Math

    0x00 知识点 PHP函数: scandir() 函数:返回指定目录中的文件和目录的数组. base_convert() 函数:在任意进制之间转换数字. dechex() 函数:把十进制转换为十六进 ...

  8. Codeforces 1296E1 - String Coloring (easy version)

    题目大意: 给定一段长度为n的字符串s 你需要给每个字符进行涂色,然后相邻的不同色的字符可以进行交换 需要保证涂色后能通过相邻交换把这个字符串按照字典序排序(a~z) 你只有两种颜色可以用来涂 问是否 ...

  9. AT1983 BBQ Hard 解题报告

    题意 求\(\sum_{i=1}^{n} \sum_{j=i+1}^{n} \dbinom{a_i+a_j}{a_i+b_i+a_j+b_j}\) 解法 考虑\(\dbinom{a_i+a_j}{a_ ...

  10. 连接数据库方法2-DBCP

    DBCP(连接池): 解决对数据库建立以及关闭连接时消耗大量资源的解决方案. 程序创建和关闭对数据库连接时会消耗大量的资源,连接池技术帮我们 在程序运行的开始时就预先创建大量的连接,这些连接组成一个池 ...