Druid1.2.12版本发布,新增连接池默认配置connectTimeout和socketTimeout详解

news/2024/5/20 23:01:38/文章来源:https://blog.csdn.net/yaomingyang/article/details/126901144
新版本特性如下

这个版本连接池默认增加配置connectTimeout和socketTimeout,增强了SQL Parser

  1. 连接池DruidDataSource支持新的配置connectTimeout和socketTimeout,分别都是10秒。这个默认值会减少因为网络丢包时导致的连接池无法创建链接。
  2. 修复连接池DruidDataSource#handleFatalError方法判断是否关闭逻辑不对的问题 #4724
  3. 修复StatFilter统计Statement执行SQL只记录第一条SQL的问题 #4921
  4. 修复ParameterizedOutputVisitorUtils#restore结果不对的问题 #4532
  5. SQL Parser增强对PolarDB-X的支持 #4927
  6. SQL Parser增强对Oceanbase的支持 #4833
  7. SQL Parser增强对MySQL的支持 #4916 #4817 #4825
  8. SQL Parser增强对Clickhouse的支持 #4833 #4881
  9. SQL Parser增强对DB2的支持 #4838
  10. SQL Parser增强对Oracle的支持
连接池connectTimeout配置

在源码com.alibaba.druid.pool.DruidAbstractDataSource#createPhysicalConnection()方法中新增了如下代码:

        if (connectTimeout > 0) {if (isMySql) {physicalConnectProperties.put("connectTimeout", connectTimeout);} else if (isOracle) {physicalConnectProperties.put("oracle.net.CONNECT_TIMEOUT", connectTimeout);} else if (driver != null && "org.postgresql.Driver".equals(driver.getClass().getName())) {physicalConnectProperties.put("loginTimeout", connectTimeout);physicalConnectProperties.put("socketTimeout", connectTimeout);}}

对mysql、oracle、postgresql数据库驱动配置连接超时时间,在连接的时候生效,默认值:10000ms

连接池socket-timeout配置

在数据库出现宕机或网络宜昌市,jdbc的socket超时是必须的,由于TCP/IP结构,socket没有办法检测到网络错误,因此应用程序也不能检测到与数据库之间的连接是否已经断开。如果没有socket超时,应用程序会一直等待数据库返回结果。为了避免死连接,socket必须设置超时时间,通过设置超时时间,可以防止出现网络错误时一直等待的情况并缩短故障时间。

在源码com.alibaba.druid.pool.DruidAbstractDataSource#createPhysicalConnection()中新增如下代码:

            if (socketTimeout > 0 && !netTimeoutError) {try {//默认sql执行10sconn.setNetworkTimeout(netTimeoutExecutor, socketTimeout);} catch (SQLFeatureNotSupportedException | AbstractMethodError e) {netTimeoutError = true;} catch (Exception ignored) {// ignored}}

其中netTimeoutExecutor是SynchronousExecutor的实例对象

    class SynchronousExecutor implements Executor {@Overridepublic void execute(Runnable command) {try {command.run();} catch (AbstractMethodError error) {netTimeoutError = true;} catch (Exception ignored) {if (LOG.isDebugEnabled()) {LOG.debug("failed to execute command " + command);}}}}

SynchronousExecutor是在com.alibaba.druid.pool.DruidDataSource#init方法中进行初始化

其中command的具体实现是com.mysql.cj.jdbc.ConnectionImpl.NetworkTimeoutSetter(mysql的具体实现)

    private static class NetworkTimeoutSetter implements Runnable {private final WeakReference<JdbcConnection> connRef;private final int milliseconds;public NetworkTimeoutSetter(JdbcConnection conn, int milliseconds) {this.connRef = new WeakReference(conn);this.milliseconds = milliseconds;}public void run() {JdbcConnection conn = (JdbcConnection)this.connRef.get();if (conn != null) {synchronized(conn.getConnectionMutex()) {((NativeSession)conn.getSession()).setSocketTimeout(this.milliseconds);}}}}
连接池query-timeout、transaction-query-timeout配置
  • query-timeout:设置JDBC驱动执行Statement语句的秒数,如果超过限制,则会抛出SQLTimeoutException,默认:0 单位:秒 无限制
  • transaction-query-timeout:设置JDBC驱动执行N个Statement语句的秒数(事务模式),如果超过限制,则会抛出SQLTimeoutException,默认:0 单位:秒 无限制

具体实现代码在com.alibaba.druid.pool.DruidAbstractDataSource#initStatement中如下:

    void initStatement(DruidPooledConnection conn, Statement stmt) throws SQLException {boolean transaction = !conn.getConnectionHolder().underlyingAutoCommit;int queryTimeout = transaction ? getTransactionQueryTimeout() : getQueryTimeout();if (queryTimeout > 0) {stmt.setQueryTimeout(queryTimeout);}}public int getTransactionQueryTimeout() {if (transactionQueryTimeout <= 0) {return queryTimeout;}return transactionQueryTimeout;}public int getQueryTimeout() {return queryTimeout;}
总结

看了上面的几个时间设置估计会有点懵逼,这么多时间怎么区分,先看一下从网上找到的图:

超时时间区分

高级别的timeout依赖于低级别的timeout,只有当低级别的timeout无误时,高级别的timeout才能确保正常;如:当socket timeout出问题时,高级别statement timeout和transaction timeout都将失效。statement timeout无法处理网络连接失败时的超时,它能做的仅仅是限制statement的操作时间,网络连接失败时的timeout必须交由JDBC来处理,JDBC的socket timeout会受到操作系统socket timeout设置的影响。

GitHub地址:https://github.com/mingyang66/spring-parent

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_9101.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

股票量化分析工具QTYX使用攻略代码说明——高速版本地行情源v2.5.1

搭建自己的量化系统如果要长期在市场中立于不败之地&#xff01;必须要形成一套自己的交易系统。否则&#xff0c;赚钱或者亏钱我们很难归纳总结&#xff0c;往往是凭借运气赚钱&#xff0c;而不是合理的系统模型&#xff0c;一时凭借运气赚的钱长期来看会因为实力还回去。QTYX…

mac 中配置idea自带maven环境变量

1.查找 maven 地址 访达--应用程序-- idea如图&#xff1a; 2.双击 选择 显示包内容&#xff1a; 3.找到maven地址&#xff1a;/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3 4.配置环境变量 &#xff08;1&#xff09;配置环境变量 终端输入 vim …

c++ Primer 第四章 表达式

4.1 基础 略 4.2 算术运算符4.3 逻辑和关系运算符4.4 赋值运算符 略 4.5 递增和递减 ++i 先自增后运算 i++ 先运算后自增 4.6 成员访问运算符 int main() {string s1 = "a string";string *pS1 = &s1;cout << pS1->size() << endl; // 等价于(*p)…

【JavaScript设计模式】增强版发布订阅模式——Webpack的核心Tapable(一)

Tapable简介 Webpack整体架构的实现就是靠它的插件系统&#xff0c;其中Compiler和Compilation负责管理整个构建流程&#xff0c;同时暴露出一些Hook&#xff0c;然后由不同职责的插件来监听这些Hook&#xff0c;并在合适的时机完成具体的工作。Tapable是整个Webpack插件系统的…

CentOS二进制安装Containerd

Containerd有两种安装包∶ 1>. 第一种是containerd-xxx&#xff0c;这种包用于单机测试没问题&#xff0c;不包runC&#xff0c;需要提前安装。 2>. 第二种是cri-containerd-cni-xxx&#xff0c;包含runC和k8s里的所需要的相关文件。k8s集群里需要用到此包&#xff0c;…

Qt5.12.2添加mqtt模块

Qt5.12.2添加mqtt模块下载 mqtt Qt 子模块使用 Qt 编译模块并install 生成动态库qtcreator 打开解压后的 qtmqtt源码下的 pro 工程文件下载 mqtt Qt 子模块 https://download.qt.io/official_releases/qt/5.15/5.15.4/submodules/ 下载后解压&#xff1a; 使用 Qt 编译模块并…

Go语言实现网盘系统(上)

该项目将基于go-zero和xorm go-zero中文文档: https://legacy.go-zero.dev/cn/ Xorm中文文档: http://xorm.topgoer.com/ 功能划分 整个项目可以分为3个模块: 用户模块、存储池模块和文件共享模块数据库设计 用户是一个实体,建立对应的表user_basic,存储了用户信息,DDL如下:…

ViLBERT—(NeurIPS-2019)

ViLBERT(Vision-and-Language BERT)是发表于2019年的论文&#xff0c;在功能上实现了文本图像的多模态特征提取与分类。改论文的特点是使用了双流模型&#xff0c;即先各个模态特征单独自注意力&#xff0c;再经过transformer交叉注意力。单流是将不同模态特征序列先拼接起来&a…

FluentCRM 2.5 – 大量新功能,自动化你的业务!

大家好&#xff01; 等待结束了&#xff01;我知道你们都在热切地等待另一个 FluentCRM 更新并且它已经上线了。 这一次&#xff0c;我很高兴地宣布我们开发了一些史诗级、最令人期待的功能。让我们开始了解 FluentCRM 2.5&#xff01; 客户关系管理是关于从您的潜在客户、顾…

ASO优化之手游该如何获得巨量新增(上)

现今各家应用商店里的应用和手游数量都非常多&#xff0c;那么提高曝光和获得自然新增是一项非常困难的工作。所以&#xff0c;应用产品ASO优化已经是所有同行都必做的功课之一。且每天都有很多款新游戏发布&#xff0c;所以想让你的手游脱颖而出就更加困难。手机游戏现已经成为…

多线程---同步方法及同步块(解决线程不安全)

同步方法 注意:锁的量是变化的量,需要增删改的对象 三大不安全案例解决方案: 案例1(火车站买票) package com.mokuiran.thread.synchronizedtest;​//不安全买票//线程不安全,将会输出负数public class UnsafeBuyTicket{​ public static void main(String[] args) { …

LayaAir 2.12.2新版本已发布,即将进入3.0时代

2.13.2这个LayaAir引擎小版本&#xff0c;修复了若干IDE与引擎的BUG&#xff0c;新增了一些2D的功能&#xff0c;3D也有所优化。这个小版本将成为LayaAir 2.0系列引擎的一个重要里程碑版本。自此开始&#xff0c;2.x引擎如果没有平台适配的新功能&#xff0c;将不会再出现beta版…

【博客498】k8s kubelet device-plugins

k8s kubelet device-plugins 场景&#xff1a; 对于云的用户来说&#xff0c;在 GPU 的支持上&#xff0c;他们最基本的诉求其实非常简单&#xff1a;我只要在 Pod 的 YAML 里面&#xff0c;声明某容器需要的 GPU 个数&#xff0c;那么 Kubernetes 为我创建的容器里就应该出现…

2022Google开发者大会—我的首次参会体验

一、大会简介 Google 开发者大会 (Google Developer Summit) 是 Google 面向开发者和科技爱好者展示最新产品和平台的年度盛会。2022 年&#xff0c;Google 开发者大会以 “共码未来” 为主题&#xff0c;携手开发者与合作伙伴&#xff0c;以科技之力&#xff0c;突破想象&…

Petalinux配置

目录 一、设计流程 1.Petalinux环境变量 2.创建petalinux工程 3.配置 petalinux 工程 4.配置 Linux 内核 5.配置 Linux 根文件系统 6.配置设备树 7.编译工程 8.制作BOOT.BIN启动文件 9.启动下载 三、配置详解 ①使能环境变量 ②创建petalinux工程 ③配置petalinu…

数据通信 路由交换

数据通信 路由交换 ISP :运营商提供 设备 device 介质 Media 消息/报文 message/data 协议 protocol 发送方/信息源 sender/source 接收方/信息方 receiver/destination PDU 协议数据单元 分为 (传输层)段 (网络层)包 (数据链路层)帧 (物理层)比特 数据字段的以太网数…

归并排序(MergeSort)

文章目录思路分析两个有序数组的归并一个无序数组的拆分和归并代码实现递归实现非递归版本复杂度和稳定性空间复杂度时间复杂度稳定性思路分析 两个有序数组的归并 现在给你两个有序数组&#xff0c;让你进行归并成一个大的有序数组。 nums1 [1,2,3] nums2 [2,5,6] > n…

搭建 Sentry 服务

Sentry 提供并维护了一个基于 Docker 和 Docker Compose 的开箱即用的简单用例&#xff0c;直接通过运行 bash 脚本就可以快速搭建出一个 Sentry 服务。 准备工作 我是用的是CentOS 7的云服务器&#xff08;sentry 推荐最低配置4核8G&#xff09;&#xff0c;首先我们要安装 d…

论EDAG浏览器插件对IDEA上自己编写的HTML的影响

当使用IDEA启动HTML界面用EDAG浏览器访问时,此时如果浏览器有安装拓展会直接影响源代码解决方法:关闭拓展,刷新后此行自动删除,事件执行正常

3D Slicer学习记录(0)--利用OpenIGTLink实现数据发送接收

1、前记&#xff1a; 最近在上手学习3D Slicer&#xff0c;作为开源医学图像软件在临床和学术研究中应用广泛&#xff0c;基于openIGTLink协议为框架实现了很多手术导航系统。然而要从头实现手术导航系统并非易事&#xff0c;利用Slicer可以加速这一进程。要了解这部分可以在官…