分布式关于 druid 连接池参数问题-爱可生
connygpt 2024-10-12 16:59 6 浏览
关键词:分布式关系型数据库、分布式数据库 MySQL、分布式数据库 分片
最近用户在使用 druid 连接池连接 dble 时,应用会有不定时出现下面的错误:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 425,724 milliseconds ago. The last packet sent successfully to the server was 425,725 milliseconds ago.
这种错误还是很常见的,猜测是应用拿到了已经 close 的连接并继续使用从而引发上面的问题。因此,我们想开启 druid 中的对空闲连接检测的机制。
在查询文档的过程中,发现了两个参数,分别是 testWhileIdle 和 keepAlive(1.0.28 版本引入),那到底这两个参数有什么区别?
下面我们使用 1.1.13 版本的 druid 做一个测试。
结论
- 开启 testWhileIdle 之后,druid 不会在 timeBetweenEvictionRunsMillis 指定的周期内检测空闲连接的有效性,而是在连接取出时对连接做一下检测。
- 开启 keepAlive 之后,druid 会在 timeBetweenEvictionRunsMillis 指定的周期内检测空闲连接的有效性。
因此在实际使用中,建议开启 keepAlive 参数用于对空闲连接做有效性检测。Druid 中 testWhileIdle 和普通的连接池(DBCP 等)所表达的含义并不相同,使用时候需要慎重。
详细测试过程
测试程序原理是:首先初始化 druid 连接池,使其中有一个空闲连接。我们设置 TimeBetweenEvictionRunsMillis 为 10s,分别打印 10s 前后连接池中连接的信息。连接信息中 LastActiveTime 这个属性表示这条连接上次被使用的时间。通过观察前后两次打印的 LastActiveTime 是否有差别,来推断期间是否有对连接下发语句进行过有效性检测。
测试程序:
public static void main(String[] args) {
try {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://127.0.0.1:8066/testdb2?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 开启 testWhileIdle 参数
// dataSource.setTestWhileIdle(true);
// 开启 keepalive 参数
dataSource.setKeepAlive(true);
// 设置检测时间为 10s
dataSource.setTimeBetweenEvictionRunsMillis(10 * 1000);
dataSource.setMinEvictableIdleTimeMillis(5000);
dataSource.setValidationQuery("select 'x'");
dataSource.setMinIdle(1);
dataSource.setMaxActive(1);
Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("select 1");
ps.close();
conn.close();
// 第一次结果
System.out.println(dataSource.dump());
Thread.sleep(12000);
// 第二次结果
System.out.println(dataSource.dump());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
开启 keepalive 参数
第一次结果:
{
CreateTime:"2021-03-23 18:46:59",
ActiveCount:0,
PoolingCount:1,
CreateCount:1,
DestroyCount:0,
CloseCount:1,
ConnectCount:1,
Connections:[
{ID:515132998, ConnectTime:"2021-03-23 18:46:59", UseCount:1, LastActiveTime:"2021-03-23 18:47:00"}
]
}
第二次结果:
{
CreateTime:"2021-03-23 18:46:59",
ActiveCount:0,
PoolingCount:1,
CreateCount:1,
DestroyCount:0,
CloseCount:1,
ConnectCount:1,
Connections:[
{ID:515132998, ConnectTime:"2021-03-23 18:46:59", UseCount:1, LastActiveTime:"2021-03-23 18:47:09"}
]
}
观察第一次结果和第二次结果中 Connections 的 LastActiveTime 值,分别是 2021-03-23 18:47:00 和 2021-03-23 18:47:09,发现两个值变化,可以推断出 10s 內有对连接下发语句进行过有效性检测。
开启 testWhileIdle 参数
第一次结果:
{
CreateTime:"2021-03-23 18:52:38",
ActiveCount:0,
PoolingCount:1,
CreateCount:1,
DestroyCount:0,
CloseCount:1,
ConnectCount:1,
Connections:[
{ID:515132998, ConnectTime:"2021-03-23 18:52:39", UseCount:1, LastActiveTime:"2021-03-23 18:52:39"}
]
}
第二次结果:
{
CreateTime:"2021-03-23 18:52:38",
ActiveCount:0,
PoolingCount:1,
CreateCount:1,
DestroyCount:0,
CloseCount:1,
ConnectCount:1,
Connections:[
{ID:515132998, ConnectTime:"2021-03-23 18:52:39", UseCount:1, LastActiveTime:"2021-03-23 18:52:39"}
]
}
观察第一次结果和第二次结果中 Connections 的 LastActiveTime 值,分别是 2021-03-23 18:52:39 和 2021-03-23 18:52:39,发现两个值没有变化,可以推断出 10s 內没有对连接下发语句进行过有效性检测。
相关推荐
- Golang报表项目的Java重构过程
-
最近,完成了从原先使用Golang生成报表的工程项目,到Java项目来重构。【背景内容】最初使用Golang,主要是由于语言自身的精简性。不管是搭建HTTP服务端,还是对传统数据库的数据获取,都有...
- 不懂代码也能做出酷炫可视化大屏
-
最近在做一个数据可视化大屏项目,从指标设计、视觉设计、可视化动效到大屏硬件、开发工具整个流程,总结了一些经验和观点,想和大家分享。大屏制作工具大屏的制作,可以用代码开发或现成的可视化工具来实现。用的比...
- 爬虫界的启蒙老师,python超爽爬取入门案例分享
-
爬虫,就是授权的或公开数据的自动采集。百度,就是一只爬虫,一条百足之虫。学会爬虫,会让你以为自己离超越百度指日可待。人有多大胆,地有多大产,梦想还是要有的,万一实现了呢。人不怕有梦想,就怕不知道,不敢...
- 多亏这几个工具,我终于搞懂了数据分析怎么做
-
说起来,数据分析这东西之前真是让我头疼不已,感觉就像是个无解的迷宫。但多亏这几个工具,竟然帮我打开了这扇大门,让我终于搞明白了数据分析是怎么一回事。数据分析可不仅仅是个简单的任务,它涉及数据收集、处理...
- 主流富文本编辑器推荐,网站编辑器排名不分先后及特点
-
富文本编辑器(RichTextEditor,简称RTE)是一种提供类似于MicrosoftWord编辑功能的工具,在后台处理文章编辑时,深受不会编写HTML但又需要设置各种文本格式的用户喜爱,但...
- 文库系统开发全攻略:技术要点与实战案例
-
在信息爆炸的时代,文库系统作为知识管理的基石,正面临着前所未有的挑战。随着人工智能技术的崛起,我们有机会重新定义文档的存储、检索和交互方式。本文将深入探讨AI技术如何赋能文库系统,提升其智能化水平,从...
- Apache ECharts:基于JavaScript的数据可视化图表库
-
#挑战30天在头条写日记#ApacheECharts是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而Python是一门富有表达力的语言,很适合用于数...
- 某个网站打不开,其它网站都正常怎么办?
-
前两天学echarts,结果官网打不开,其它网站都能正常打开,自己家里的网络打不开echarts官网,把echarts官网地址发给朋友都能打开,然后综合网上查看的资料,确定是dns的问题,有两种方法...
- ECharts 水球图
-
水球图是一种适合于展现单个百分比数据的图表类型,ECharts的水球图插件使你能够通过非常简单的配置,实现酷炫的数据展示效果。那么,今天我们就一起来学习一下,如何使用ECharts水球图。第一步...
- 用echarts画图表好,还是dhtmlxGantt画图表好?实战验结果
-
事情是这样的早些时候,我接到了一个需求,说要将项目里程碑用甘特图展示,一脸懵逼的我先是搜一下什么是“甘特图”:From百度百科:甘特图(Ganttchart)又称为横道图、条状图(Barch...
- 轻量级 Markdown 写作工具:One Markdown
-
大家好,我是oulvhai,MWeb的作者,MWeb是macOS和iOS/iPadOS下的Markdown写作/记笔记/静态博客生成软件。所以简单地来说我就是专门做ma...
- 【大屏可视化组态编辑器】图表
-
大屏中的图表大使用的是开源可视化图表库Echarts在线编辑:https://v.le5le.com/使用1.在html中引入echarts资源包<scriptsrc="ech...
- 20多个好用的 Vue 组件库,请查收!
-
每日一荐:Freemen,程序员自己的求职招聘软件,赶紧下载收藏一波,留着下次跳槽用。在本文中,我们将探讨一些最常见的vuejs组件。你可以收藏一波。VueTables-2地址:https://g...
- 弃用 Echarts,推荐选择Vue Data UI!
-
各位网友大家好,今天,我要向大家隆重推荐一款令人惊艳的可视化图表库——VueDataUI,一个赋予用户权力的数据可视化Vue3组件库。前言VueDataUI诞生于一个问题:如果你的仪表板...
- Echarts仿电梯运行图
-
本文适合有一定Echarts基础的人员,至少可以面向API编程。场景假设我们有这样一个需求:实现一个柱状图,柱状图中间有一个小块表示电梯,柱状图本身作为建筑物。而且电梯需要上下运行动画。实现工具优先选...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)