一篇文章彻底理解数据库的各种 JDBC 超时参数 1

简介: 一篇文章彻底理解数据库的各种 JDBC 超时参数

一篇文章彻底理解数据库的各种 JDBC 超时参数

1 前言

在日常数据库的使用过程中,我们经常会遇到各种超时,特别是在网络不稳定和业务高并发的情况下。 理解这些超时的背后原理和工作机制,以及不同数据库下的超时参数和设置方式,无疑会对异常状况下的问题排查大有裨益;通过合理配置这些超时参数,也可以减少各种异常情况下应用宕机恢复的时间,从而提高 RTO 和 RPO,满足 SLA 的要求。

本片文章,我们就来一起学习下这些超时的相关知识。

2 数据库的超时参数有哪些?

数据库的超时参数有以下几种:

  • 事务超时:transaction timeout;
  • 查询超时 query timeout,有时也被称为语句超时 statement timeout;
  • 套接字超时(socket timeout):具体又包括登录超时 loginTimeout,连接超时 connectTimeout,和常规的套接字超时 socket timeout,其中连接超时有时也被称为网络超时 NetworkTimeout;

除了以上几个数据库的超时参数,还需要注意,应用程序和数据库所在的服务器也可以配置操作系统级别的套接字超时检测机制。

3 事务超时的含义是什么?

事务超时,即 transaction timeout, 可以用来限制某个事务中所有 statement 语句的处理时间之和的最大值,简单来说,事务超时时间 statement timeout = 语句超时时间 statement/query timeout * 事务中语句个数 + 其他耗时(如业务代码处理时间,gc 垃圾回收时间等)

事务超时一般在应用框架中进行配置, 如 spring 中,可以使用注解 @Transactional 指定。

4 查询超时的含义是什么?

查询超时,即 query timeout,有时也被称为语句超时 Statement timeout,可以用来限制某个 statement 语句(可以是增删改查)的最大执行时间,若该 sql语句在该超时时间内还没有返回执行结果,应用端的数据库驱动程序就会抛出超时异常,并发送取消执行的信号给远程的数据库管理系统,由数据库管理系统取消该语句的执行。

  • JDBC 提供了标准 API 来指定语句超时: java.sql.Statement.setQueryTimeout(int timeout);
  • 不过在实际应用中,大多数开发者都不会通过代码直接指定语句超时,而是使用框架提供的配置机制来指定语句超时;
  • 比如 mybatis中,可以通过注解 @defaultStatementTimeout 指定默认的语句超时时间,并在具体的 SQL语句中通过注解 @timeout 覆盖全局的默认值;
  • 语句超时的默认值是0,即没有超时时间,具体超时时间的配置,需要根据业务特征进行配置,并没有统一的推荐值;
  • 在使用 batch 机制时,该超时时间是适用于某个单独的sql还是该批次所有sql之和,JDBC并没有统一要求,由具体的数据库驱动自行实现;

640.png


5 查询超时的工作机制是什么?

查询超时在不同数据库管理系统和不同驱动下,其工作机制略有不同,但其工作原理是相似的,即大都是通过一个独立的线程来跟踪语句的执行时间,在执行时间超过指定的超时时间时,应用端抛出超时的错误,并通过底层的数据库连接发送取消执行的信号给远程的数据库管理系统,由数据库管理系统取消该语句的执行。

比如 Oracle数据库中,其查询超时的工作机制大体如下:

  • 创建待执行 statement:Creates a statement by calling Connection.createStatement();
  • 触发执行 statement:Calls Statement.executeQuery();
  • 通过 statement 底层的连接将 statement 远程传输给数据库管理系统:The statement transmits the Query to Oracle DBMS by using its own connection.
  • 注册该 statement 到超时处理线程 OracleTimeoutPollingThread:The statement registers a statement to OracleTimeoutPollingThread (1 for each classloader) for timeout process.

640.png


  • 执行时发生了超时:Timeout occurs.
  • 超时处理线程调用方法取消语句的执行:OracleTimeoutPollingThread calls OracleStatement.cancel().

640.png


  • 通过 statement 底层的连接,发送取消执行的信号给远程的数据库管理系统,以取消语句的执行:Sends a cancel message through the connection and cancels the query being executed.

640.png


再比如Mysql中,其查询超时的工作机制大体如下:

  • 创建待执行 statement: Creates a statement by calling Connection.createStatement().
  • 触发执行 statement:Calls Statement.executeQuery().
  • 通过 statement 底层的连接远程传输 statement 给数据库管理系统:The statement transmits the Query to MySqlServer by using the internal connection.
  • 为每个 statement 创建一个超时处理线程(在 5.1 版本中,更改为为每个连接创建一个超时处理线程):The statement creates a new timeout-execution thread for timeout process;(For version 5.1.x, it changes to assign 1 thread for each connection.)
  • 向超时处理线程注册超时处理逻辑:Registers the timeout execution to the thread.
  • 执行时发生了超时:Timeout occurs.
  • 超时处理线程创建到数据库管理系统的连接:The timeout-execution thread creates a connection that has the same configurations as the statement.
  • 超时处理线程通过底层的连接,发送取消执行的信号给远程数据库管理系统以取消语句的执行:Transmits the cancel Query (KILL QUERY "connectionId“) by using the connection.

640.png

相关文章
|
4月前
|
Java 关系型数据库 数据库连接
JDBC:Java与数据库的“黄金搭档”,为何它如此重要?
JDBC:Java与数据库的“黄金搭档”,为何它如此重要?
50 8
|
21天前
|
SQL druid 数据库
如何进行数据库连接池的参数优化?
数据库连接池参数优化包括:1) 确定合适的初始连接数,考虑数据库规模和应用需求;2) 调整最大连接数,依据并发量和资源状况;3) 设置最小空闲连接数,平衡资源利用和响应速度;4) 优化连接超时时间,确保系统响应和资源利用合理;5) 配置连接有效性检测,定期检查连接状态;6) 调整空闲连接回收时间,适应访问模式并配合数据库超时设置。
|
26天前
|
缓存 监控 关系型数据库
如何根据监控结果调整 MySQL 数据库的参数以提高性能?
【10月更文挑战第28天】根据MySQL数据库的监控结果来调整参数以提高性能,需要综合考虑多个方面的因素
66 1
|
2月前
|
监控 数据库 索引
避免锁等待超时对数据库性能的影响
【10月更文挑战第16天】避免锁等待超时对数据库性能的影响需要综合考虑多个方面,通过不断地优化和改进,来提高数据库的并发处理能力和稳定性。
37 1
|
3月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
441 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
2月前
|
SQL 数据管理 数据库
文章初学者指南:SQL新建数据库详细步骤与最佳实践
引言:在当今数字化的世界,数据库管理已经成为信息技术领域中不可或缺的一部分。作为广泛使用的数据库管理系统,SQL已经成为数据管理和信息检索的标准语言。本文将详细介绍如何使用SQL新建数据库,包括准备工作、具体步骤和最佳实践,帮助初学者快速上手。一、准备工作在开始新建数据库之前,你需要做好以下准备工作
132 3
|
2月前
|
SQL Java 数据库
Springboot+spring-boot-starter-data-jdbc实现数据库的操作
本文介绍了如何使用Spring Boot的spring-boot-starter-data-jdbc依赖来操作数据库,包括添加依赖、配置数据库信息和编写基于JdbcTemplate的数据访问代码。
105 2
|
2月前
|
SQL 关系型数据库 MySQL
数据库:MYSQL参数max_allowed_packet 介绍
数据库:MYSQL参数max_allowed_packet 介绍
107 2
|
3月前
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
2月前
|
SQL druid Java
JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO
JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO
35 0