PG的管道模式如何工作
PG的管道模式如何工作
今天给大家介绍PG引入的一个很酷的特性--管道模式。
什么是管道模式呢?管道模式允许应用程序发送查询,而不用读取先前发送查询的结果。一句话,它允许在单个网络事务中发送和接收多个查询和结果,从而显著提高性能。
正如所有好主意一样,都有一个范例:人们可以使用应用程序代码来模拟这种行为。在客户端与服务之间异步通信了一段时间,或者称之为“批处理模式”。有许多现有的解决方案以异步方式处理多个查询。例如PgJDBC多年来一直使用标准JDBC批处理接口支持批处理模式。当然,还有老的可靠备用dblink。
流水线模式的不同之处在于它提供了一个开箱即用的解决方案,大大降低了应用程序代码处理客户端--服务端会话的复杂性。
传统的批处理模式
流水线模式
尽管在PG14中引入,管道模式适用于当前任何版本。因为增强在客户端使用的LIBPQ中,而不是服务端本身。
现在是坏消息了:利用流水线模式和需要使用“C”或能够之间与LIBPQ交互的编程语言。不幸的是,目前还没有太多的ODBC开发方式提供必要的钩子来利用这个增强的特性。因此,需要使用上述编程语言来涉及和编程客户端--应用程序会话。
提示:对于某些人来说,这是一个为自己命名并创建一个方便的LIBPQ管道模式接口的号方法。
怎么运行
现在来探讨下这个机制是如何工作的。
保持简单:
1)客户端首先连接到PG服务
2)客户端连接必须切换到管道模式
3)一旦进入管道模式,SQL语句就会被发送到服务
4)达到服务后,语句立即执行并将结果发送回客户端,即不需要客户端/服务端确认
5)因为每个SQL语句都是按顺序发送,所以应用程序逻辑可以使用状态机或者利用FIFO队列来处理结果
6)一旦所有异步语句都已执行并返回,客户端应用程序显式终止管道模式并将连接返回到默认设置
由于每个SQL语句本质上都是幂等性的,因此由客户端逻辑来解释结果。发送SQL语句并提取彼此无关的结果是一回事,但当处理具有某种程度上互相依赖的逻辑结果时,会变得更加复杂。
可以将异步SQL语句捆绑为单个事务。但与所有事务一样,这些异步发送的SQL语句中任何一个失败都将导致所有SQL语句回滚。
当然API确实在管道故障情况下提供错误处理。在FATAL情况下,当管道本身失败时,客户端连接会接收到错误通知,从而将剩余的排队操作标记为丢失。此后恢复正常处理,就好像管道已被客户端明确关闭,并且客户端连接保持活动状态。
细节
对于C程序员来说,这里有一些参考资料:
1)如前所述,可以针对多个版本的PG使用此功能,但尽在PG14及以后版本进行了描述
2)PG14源代码:src/test/modules/libpq_pipeline/libpq_pipeline.c提供了一个执行SELECT函数调用的简单例子
注意
1) 流水线模式专为异步模式而涉及,因此同步模式不可使用,这有点违背了流水线模式的目的。
2) 一次只能发送一个SQL命令,不允许多个SQL
3) 不允许复制
4) 在发送事务COMMIT情况下:客户端在收到相应结果前,不能假定事务已提交
5) 利用流水线模式需要使用C或者可以访问libpsq api的语言进行编程
参考
https://stackoverflow.com/questions/65469533/where-is-query-pipelining-in-libpq
https://www.postgresql.org/message-id/flat/CAMsr+YFUjJytRyV4J-16bEoiZyH=4nj+sQ7JP9ajwz=B4dMMZw@mail.gmail.com
原文
https://www.percona.com/blog/how-postgresql-pipeline-mode-works/
PG的管道模式如何工作相关推荐
- 检测到的ASP.NET设置不适用于集成管理管道模式
我安装了DotNetOpenAuth SDK-3.4.5.10201.vsix,我无法让它工作. 它在本地工作(当我作为localhost运行时),但当我尝试发布它不起作用. 我得到的IIS错误消息是 ...
- 如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode)
如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode) 有网友问到一个相关问题就是:如何理解IIS 7中的应用程序池的管道模式,尤其是如何理解"托管模型( ...
- 文件表单带数据一起提交spring_基于 Spring 实现管道模式的最佳实践
管道模式(Pipeline Pattern) 是 责任链模式(Chain of Responsibility Pattern) 的常用变体之一.在管道模式中,管道扮演着流水线的角色,将数据传递到一个加 ...
- Redis进阶实践之十八 使用管道模式提高Redis查询的速度
Redis进阶实践之十八 使用管道模式提高Redis查询的速度 原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来 ...
- IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解
IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员 ...
- 基于 Spring 实现管道模式的最佳实践
本篇为设计模式第二篇,第一篇可见设计模式最佳套路 -- 愉快地使用策略模式 管道模式(Pipeline Pattern) 是责任链模式(Chain of Responsibility Pattern) ...
- 设计模式——管道模式(一)
管道模式(Pipeline Pattern) 是 责任链模式(Chain of Responsibility Pattern)的常用变体之一.在管道模式中,管道扮演着流水线的角色,将数据传递到一个加工 ...
- 责任链模式(以及变种管道模式)的应用案例
目录 一.前言 二.责任链简单使用 场景说明 1.前置代码准备 2.基本接口定义 3.业务节点处理代码 活动时效性检验 活动价格管控 活动风控校验 4.业务代码 5.测试与结果展示 测试代码 结果展示 ...
- ASP.NET 获取IIS应用程序池的托管管道模式
asp.net 中怎样较为简单的获取网站程序池的托管管道模式 目前已知的方式是根据这个帖子https://github.com/kakalotte/... ,利用DirectoryEntry,但是程序 ...
最新文章
- 汇总Javascript各种判断脚本(javascript经典例子)
- Jenkins的卸载
- 两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍
- LeetCode 5. 最长回文子串(动态规划)
- 人脸方向学习(十):Face Detection-MobileNet_SSD解读
- EasyUI 1.5.1 美化主题大包 Insdep Theme 1.0.3 已发布,开源下载
- oracle数据库查询空间大小,Oracle查看数据库空间使用情况
- python 定时任务框架APScheduler
- c语言上机南开100题,全国计算机三级网络技术C语言南开上机南开100题(WORD版)
- 微商怎么做大做强,教你一套做微商全新打法
- 苹果支持WebRTC
- logo设计软件哪个好用?小白也能学会的logo设计小技巧
- 如何解决“应用程序无法启动,因为应用程序的并行配置不正确“问题
- ICC II setupfloorplan
- 天下谁人不识君,体面的礼品
- mysql按照音序排列_什么是按音序排列?
- 片上网络之路由器微结构
- Android知识点-圆角
- Parse 教程:网络后台基础
- CVPR 2021 | 超实用!住宅户型识别与重建技术来啦!