get connection timeout retry : 1

2024-02-06 11:18:26.364 ERROR 23752 --- [eate-1838225797] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:oracle:thin:@192.168.66.88:1521:orcl, errorCode 17002, state 08006

有正在执行的SQL时,连接不可用就会触发重试,进而报错。

com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 20000, active 68, maxActive 200, creating 1, createElapseMillis 3099, createErrorCount 7, runningSqlCount 68 : SELECT xxx

breakAfterAcquireFailure默认是false,意思是重试失败可以一直尝试,也就是当数据库恢复、网络恢复时,数据库连接也会跟着恢复。

正常情况是这样的,除非发现有连接泄露。是在不行就立即平滑重启先。

有时候看到数据库连接异常日志,未必是数据库服务器、网络等问题,也未必是数据库连接池的问题,根本的原因是多样化的。

比如数据库系统、应用系统等对长连接超时的设置。比如应用服务代码问题导致内存不足、CPU不足等原因,应用被判定为不可用进而下线等原因。

低版本的keepAlive属性未设置导致的创建连接失败问题。默认是关闭的。建议直接使用1.2.20以上版本即可

通过JVM启动参数配置

-Ddruid.keepAlive=true

或者springboot的配置姿势。

打开KeepAlive之后的效果

初始化连接池时会填充到minIdle数量。

连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。

当网络断开等原因产生的由ExceptionSorter检测出来的死连接被清除后,自动补充连接到minIdle数量。

Failed to obtain JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 0, maxActive 100, creating 1, createElapseMillis 686180, createErrorCount 3

还有一种情况是并发量高,超过了线程池的最大连接数时,就会异常:

也就是一直在 “超时”范围内创建不了足够的线程。

org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 2005, active 13, maxActive 15, creating 1, createElapseMillis 22

最小空闲连接是2,最大Active允许20;minEvictableIdleTimeMillis为31秒,初始化完成后,先运行5个,之后在运行3个



ActiveCount就是8个,池中0个

{

CreateTime:"2024-02-07 15:35:54",

ActiveCount:8,

PoolingCount:0,

CreateCount:8,

DestroyCount:0,

CloseCount:0,

ConnectCount:8,

Connections:[

]

}

先运行的5个完成后:将连接放回池中,因此运行中是3个,池中是5

{

CreateTime:"2024-02-07 15:35:54",

ActiveCount:3,

PoolingCount:5,

CreateCount:8,

DestroyCount:0,

CloseCount:5,

ConnectCount:8,

Connections:[

{ID:1630226699, ConnectTime:"2024-02-07 15:36:44", UseCount:1, LastActiveTime:"2024-02-07 15:36:51"},

{ID:1829353693, ConnectTime:"2024-02-07 15:36:45", UseCount:1, LastActiveTime:"2024-02-07 15:36:51"},

{ID:1368894668, ConnectTime:"2024-02-07 15:36:44", UseCount:1, LastActiveTime:"2024-02-07 15:36:51"},

{ID:41020387, ConnectTime:"2024-02-07 15:36:44", UseCount:1, LastActiveTime:"2024-02-07 15:36:51"},

{ID:1931842658, ConnectTime:"2024-02-07 15:36:44", UseCount:1, LastActiveTime:"2024-02-07 15:36:51"}

]

}

等8个都运行完成后,池中剩余3个,是因为配置的minEvictableIdleTimeMillis是31秒,上面的5个在池中已经空闲超过这个时间点



{

CreateTime:"2024-02-07 15:35:54",

ActiveCount:0,

PoolingCount:3,

CreateCount:8,

DestroyCount:5,

CloseCount:8,

ConnectCount:8,

Connections:[

{ID:18126972, ConnectTime:"2024-02-07 15:36:45", UseCount:1, LastActiveTime:"2024-02-07 15:37:41"},

{ID:1695936491, ConnectTime:"2024-02-07 15:36:45", UseCount:1, LastActiveTime:"2024-02-07 15:37:42"},

{ID:978119236, ConnectTime:"2024-02-07 15:36:45", UseCount:1, LastActiveTime:"2024-02-07 15:37:42"}

]

}

再过timeBetweenEvictionRunsMillis时间之后,池中最终剩余2个

{

CreateTime:"2024-02-07 15:35:54",

ActiveCount:0,

PoolingCount:2,

CreateCount:8,

DestroyCount:6,

CloseCount:8,

ConnectCount:8,

Connections:[

{ID:1695936491, ConnectTime:"2024-02-07 15:36:45", UseCount:1, LastActiveTime:"2024-02-07 15:37:42"},

{ID:978119236, ConnectTime:"2024-02-07 15:36:45", UseCount:1, LastActiveTime:"2024-02-07 15:37:42"}

]

}



上面的情况是连接没来得及归还到连接池(比如业务方法执行时间长,或者正在归还时,新的连接请求又来了,那么就会创建新的线程来执行业务)

如果不满足时,就按照设置的从连接池获取连接的超时来异常提示。

当然如果业务方法执行快,连接被复用时是下面这样,useCount就是被复用的次数




{

CreateTime:"2024-02-07 15:58:31",

ActiveCount:0,

PoolingCount:5,

CreateCount:5,

DestroyCount:0,

CloseCount:8,

ConnectCount:8,

Connections:[

{ID:1829353693, ConnectTime:"2024-02-07 15:59:22", UseCount:1, LastActiveTime:"2024-02-07 15:59:27"},

{ID:41020387, ConnectTime:"2024-02-07 15:59:22", UseCount:1, LastActiveTime:"2024-02-07 15:59:27"},

{ID:1931842658, ConnectTime:"2024-02-07 15:59:22", UseCount:2, LastActiveTime:"2024-02-07 16:00:33"},

{ID:1630226699, ConnectTime:"2024-02-07 15:59:22", UseCount:2, LastActiveTime:"2024-02-07 16:00:33"},

{ID:1368894668, ConnectTime:"2024-02-07 15:59:22", UseCount:2, LastActiveTime:"2024-02-07 16:00:33"}

]

}

druid数据库连接池在使用中遇到的一些问题和说明的更多相关文章

  1. Druid数据库连接池配置

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

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

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

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

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

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

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

  5. Druid 数据库连接池

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

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

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

  7. 【spring boot】15.spring boot项目 采用Druid数据库连接池,并启用druid监控功能

    在http://www.cnblogs.com/sxdcgaq8080/p/9039442.html的基础上,来看看spring boot项目中采用Druid连接池. GitHub地址:示例代码 == ...

  8. Spring Boot集成Druid数据库连接池

    1. 前言 Druid数据库连接池由阿里巴巴开源,号称是java语言中最好的数据库连接池,是为监控而生的.Druid的官方地址是:https://github.com/alibaba/druid 通过 ...

  9. 基于Druid数据库连接池的DBUtil工具类

    工具类 DruidUtil.java package com.zzuli.util; import com.alibaba.druid.pool.DruidDataSourceFactory; imp ...

  10. springboot2配置druid数据库连接池

    注意配置以下的依赖: <!-- 引入druid数据源--> <dependency> <groupId>com.alibaba</groupId> &l ...

随机推荐

  1. 最新最全的BMS/EMS/PCS六大国产“储能方案”,不信你全都看过!

    作为国内领先的嵌入式产品平台提供商,创龙科技在"能源电力"行业拥有超过1000家客户,接下来就让小编向大家分享创龙科技推出的BMS/EMS/PCS"六大储能方案" ...

  2. Django详细笔记

    django 学习 特点 快速开发 安全性高 可伸缩性强 URL 组成部分 URL: 同意资源定位符 一个URL由以下几部分组成 scheme://host:port/path/?query-stri ...

  3. HGAME2023 week1-week2

    确实是高质量比赛,学到了很多知识.认识到了很多的不足. 任重而道远啊... hgame_week1 web Classic Childhood Game F12检查源码,打开Events.js 发现 ...

  4. Vue手稿4

  5. JDK1.8新特性Lambda表达式简化if-else里都有for循环的优化方式

    在日常开发过程当中,能把代码写出来,不一定就意味着能把代码写好,说不准,所写的代码在他人看来,其实就是一坨乱七八糟的翔,因此,代码简化尤其重要,我曾经遇到过这样一个类型的代码,即if-else里都有相 ...

  6. 敏捷开发(Scrum)

    ​ 一.敏捷的背景与动机 1.1 软件危机及软件工程的出现 速度是企业竞争致胜的关键因素,软件项目的最大挑战在于,一方面要应付变动中的需求,一方面要在紧缩的时程内完成项目,传统的软件工程难以满足这些要 ...

  7. 【C++】使用ort推理yolov10

    [C++]使用ort推理yolov10 前言:由于笔者是编导专业,想玩玩yolo模型,搜来搜去全是python,所以在学会之后写一篇文章帮助和笔者同样情况的人 环境 Windows 10 C++17 ...

  8. oeasy教您玩转vim - 80 - # 宏macro

    ​ 宏 macro 回忆 这次我们了解了编码格式 屏幕显示的encoding 文件保存的fileencoding 不能搞乱了 一般用什么编的就用什么解 解铃还须系铃人 打开不正确的话,就要切到正确的上 ...

  9. 在Eclipse中使用Project Explorer视图与Package Explorer视图

    1.在项目文件比较多的情况下,为了方便查看整体和及时定位到项目文件,通常会同时使用Project Explorer视图与Package Explorer视图. 2.打开Project Explorer ...

  10. Java 线程池之Jetty 线程池学习总结

    Java 线程池之Jetty 线程池学习总结 前提 Jetty 11.0.x 为什么是Jetty? Java提供4中创建线程池的快捷方式 Executors.newFixedThreadPool(); ...