Postgres 超时 (Timeout) 详解

原文地址 https://www.bytebase.com/blog/postgres-timeout/

PostgreSQL 提供各种超时 (Timeout) 设置,通过控制某些进程的持续时间来帮助管理和优化数据库操作。这些超时对于确保系统的稳定性和性能至关重要,尤其是在高流量或复杂查询的环境中。让我们一一回顾。

(一)语句超时 (statement_timeout)
statement_timeout 设置了单个查询允许执行的最长时间限制。如果查询超过了这个时间限制,PostgreSQL 将自动终止查询并返回错误信息。

ERROR:  canceling statement due to statement timeout
错误:由于语句超时而取消语句

如果单个 simple-Query 消息中出现多个 SQL 语句,则超时将分别应用于每个语句。statement_timeout 可有效防止长时间运行的查询占用过多资源或导致数据库出现性能问题。

(二)锁超时 (lock_timeout)
lock_timeout 控制一个事务为获得数据库对象(如表或行)上的锁而等待的时间,然后才会放弃并返回错误。

ERROR:  canceling statement due to lock timeout
错误:由于锁超时而取消语句

在 Postgres 中,等待获取资源锁的事务会阻塞需要在同一资源上获取冲突锁的传入事务。对于获取重量级锁(如运行 DDL 语句)的事务,建议设置 lock_timeout。常见的做法是创建一个单独的 Postgres 用户来运行 DDL,并为该用户设置一个较短的 lock_timeout。

ALTER ROLE ddl_user SET lock_timeout = 10000; -- 10 秒

(三)事务会话空闲超时 (idle_in_transaction_session_timeout)
idle_in_transaction_session_timeout 控制会话在事务中空闲的最长时间。如果会话在事务中的空闲时间超过指定的超时时间,PostgreSQL 将自动终止会话并回滚正在进行的事务。

ERROR:  terminating connection due to idle-in-transaction timeout
错误:由于事务中的空闲超时而终止连接

假设您有一个应用程序,在等待用户输入或执行一些与数据库无关的处理时,偶尔会让事务处于进行状态。如果一个事务处于进行和空闲状态的时间过长,它可能会持有表或行上的锁,从而阻止其他事务访问这些资源。通过设置 idle_in_transaction_session_timeout 可以自动终止这些空闲会话,确保资源不会被不必要地占用。即使没有重要的锁,一个进行中的事务会阻止清理( vacumm)已经被删除,但在当前事务仍然可见的元组;因此,长时间处于空闲状态会导致表膨胀。

(四)空闲会话超时 (idle_session_timeout)
idle_session_timeout 控制会话在被自动终止前的最长空闲时间。与 idle_in_transaction_session_timeout 不同的是,idle_session_timeout 只适用于在事务中处于空闲状态的会话,而 idle_session_timeout 则适用于任何处于空闲状态的会话,无论它是否在事务中。

ERROR:  terminating connection due to idle session timeout
错误:由于空闲会话超时而终止连接

在使用连接池或其他中间件时要小心,因为这样的层可能不会对意外的连接关闭做出很好的反应。好的做法是为交互式处理创建一个单独的 Postgres 用户,并相应地设置 idle_session_timeout。

ALTER ROLE interactive_user SET idle_session_timeout = 600000; -- 10 分钟

(五)事务超时 (transaction_timeout)
在这里插入图片描述

即将发布的 Postgres 17 版本将引入新的 transaction_timeout。从文档中可以看到
在一个事务中终止任何超过指定时间的会话。该限制既适用于显式事务(以 BEGIN 开始),也适用于与单条语句相对应的隐式事务。
一个典型的网络服务由 3 个主要部分组成:

  • 网络服务器
  • 应用程序服务器
  • 数据库服务器

为防止长时间连接,通常会在网络服务器和应用程序服务器上设置连接超时。当网络服务器/应用服务器已经终止连接时,再处理事务就太浪费了。在引入事务超时(transaction_timeout)之前,没有防止长时间事务的可靠方法。即使同时设置了 statement_timeout 和 idle_in_transaction_session_timeout,如果事务是由短语句和中间的短暂停顿组成的,那么该事务仍然是开放的。
你可能想知道,为什么 PostgreSQL 花了这么长时间才推出一个直接的事务超时功能 – 迟到总比不到好 😁!顺便说一句,MySQL 也没有这个功能 😜。

参考资料:
官方文档 (https://www.postgresql.org/docs/current/runtime-config-client.html)
pgsql-hackers 关于引入 transaction_timeout 的讨论 (https://www.postgresql.org/message-id/flat/f508267d1ba8f0bfd7b93181d10511dc%40oss.nttdata.com#2506da45ff92aaea65c30996fbf19c85)


💡 更多资讯,请关注 Bytebase 公号:Bytebase

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

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

相关文章

STM32CubeMX生成stm32MP135中断优先级配置错误修正方法

0 修改方法 使用STM32CubeMX生成stm32MP135代码的中断优先级配置错误,将导致所有中断优先级设置不对。 如果设置EXTI0中断优先级为10,在STM32CubeMX中配置如下: 生成的中断优先级配置代码为: 正确写法应该将中断优先级左移3位&…

python从入门到精通:函数

目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的,可重复使用的,用来实现特定功能的代码段。 name "zhangsan"; length len(nam…

二叉树学习笔记

一、树的概念 树是一种非线性的结构,它是由n个有限结点组成的一个具层次关系的集合。(像一颗倒着的树) 特点: 有一个特殊的结点,称之为根结点,根结点没有前驱结点 除了根节点以外,其余节点别分…

centos 7.9 迁移到 openEuler22.03-LTS-SP3

openEuler移植案例 | 移植操作指南 | openEuler社区官网 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 需要两台机器, 不通过原因 在待升级节点检查是否有安装x2openEuler-core时, 发现已经安装了,不能作为升级节点。该节点为: 解…

MySQL中处理JSON数据

​ 大家好,我是程序员小羊! 前言 在大数据时代,处理和分析结构化与非结构化数据的能力对于企业的成功至关重要。MySQL作为一种广泛使用的关系型数据库管理系统(RDBMS),在应对传统结构化数据方面表现出色。然…

c++每日练习记录第1天

笔记: C 中,isalnum 函数用于检查一个字符是否是字母数字字符,isalnum 函数定义在 头文件中。双指针法,双指针法是一种常用的算法技巧,特别适用于处理数组、字符串等线性数据结构中的问题。这种方法通常涉及到两个指针…

12、springboot3 vue3开发平台-前端-记住我功能实现

文章目录 1. 前端用户信息保存2. 登录页面添加3. 后端实现 1. 前端用户信息保存 使用pinia持久化保存用户名密码 src/stores/remember-me.js // 定义 store import { defineStore } from "pinia" import {reactive} from vueexport const useRememberMeStore defi…

图书管理管理系统 (GUI)

目录 Java程序设计课程设计 图书管理管理系统 一、前言 1 研究背景 2 目的和意义 3编程环境与工具 二、图书管理系统概述 1主要业务流程 三、需求分析与设计 1 系统需求分析 2.功能需求 3.性能需求 4. 安全需求 2 数据库设计 3 界面设计 四、 总…

Solidworks二次开发:通过XYZ点的曲线

在SolidWorks中,通过XYZ点创建曲线是一种根据一组点的坐标生成三维曲线的方法。这种方法适用于需要根据特定点集设计曲线的情况,比如在建模复杂几何形状或执行逆向工程时。在SolidWorks中通过XYZ点创建曲线,操作步骤如下 打开SolidWorks并新建…

利用modelscope下载模型

1. modelscope的简介 ModelScope作为一个先进的“模型即服务”(MaaS)平台,它的核心在于汇聚人工智能领域的尖端模型,降低了在现实世界应用这些前沿技术的门槛。该平台通过ModelScope库展现了其强大功能,这一库专为简化开发者体验而设计&…

Element-06.案例

一.目标 实现下面这个页面,表格中的数据使用axois异步加载数据 二.实现步骤 首先在vue项目的views文件夹中新建一个tlias文件夹,用来存储该案例的相关组件。员工页面组件(EmpView.vue)和部门页面组件(DeptView.vue&…

C语言指针详解-上

C语言指针详解-上 前言1.指针的基本概念1.1指针是什么1.2指针的声明与初始化1.3取地址符&和解引用符*& 运算符用于**获取变量的地址*** 运算符用于访问指针指向的值 2.指针的类型常见数据类型的指针指针与数组、字符串数组指针结构体指针函数指针二级指针void指针 3.指…

【数据结构】二叉树(二)遍历

上篇已经了解对二叉树有了大概了解,本篇学习二叉树的前序、中序、后序及层序遍历的递归与非递归共7种遍历方法,快收藏吧~ 目录 1、前序遍历 递归方式: 迭代方式: 2、中序遍历 递归方式: 迭代方式: …

XXX【4】策略模式

如上图所示,如果要加入一个新的货币,那么就需要对类中的Calculate函数进行修改,这违背了封闭开放原则。 上图中的方式更加合适,搞一个抽象类(方法中可以用多态调用),然后每个货币自己是一个类&a…

每日学习笔记:C++ STL之堆栈容器stack

目录 stack定义 核心接口 stack class声明 stack class定义 用户自定义的Stack Class C11特色的插入元素的新形式 运用实例 stack定义 核心接口 stack class声明 stack class定义 用户自定义的Stack Class C11特色的插入元素的新形式 运用实例

数据结构(邓俊辉)学习笔记】优先级队列 07——堆排序

1.算法 作为完全二叉堆的一个应用,这节来介绍堆排序算法。 是的,谈到优先级队列,我们很自然地就会联想到排序。因为就其功能而言,包括完全二叉堆在内的任何一种优先级队列都天生地具有选取功能,也就是选取其中的最大…

【mkdir rmdir】Centos/Linux mkdir rmdir命令详细介绍

【mkdir & rmdir】Centos/Linux mkdir & rmdir命令详细介绍 简介 mkdir rmdir 简介 mkdir 命令和 rmdir 命令是在 linux 当中比较常用的两个命令,这两个命令前者是创建空目录,后者是删除空目录。rmdir 命令的定位比较尴尬它的功能可以被 rm 命…

“论面向服务架构设计及其应用”写作框架,软考高级,系统架构设计师

论文真题 面向服务架构(Service-Oriented Architecture, SOA) 是一种应用框架,将日常的业务应用划分为单独的业务功能服务和流程,通过采用良好定义的接口和标准协议将这些服务关联起来。通过实施基于SOA的系统架构,用…

版本更新 《坚持学习计时器》软件V3.1 更新内容:自动实时显出

🌟 嗨,我是命运之光! 🌍 2024,每日百字,记录时光,感谢有你一路同行。 🚀 携手启航,探索未知,激发潜能,每一步都意义非凡。 版本更新 《坚持学习…

海量数据处理商用短链接生成器平台 - 1

第一章 海量数据处理商用短链接生成器平台介绍 第1集 什么是短链接生成器 短链接生成器是一种工具,可以将较长的链接转换成较短的链接。这种工具在许多场景中都很有用,包括营销、社交媒体分享和数据报告等。以下是一些关于短链接生成器的优点和作用&…