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的管道模式如何工作相关推荐

  1. 检测到的ASP.NET设置不适用于集成管理管道模式

    我安装了DotNetOpenAuth SDK-3.4.5.10201.vsix,我无法让它工作. 它在本地工作(当我作为localhost运行时),但当我尝试发布它不起作用. 我得到的IIS错误消息是 ...

  2. 如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode)

    如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode) 有网友问到一个相关问题就是:如何理解IIS 7中的应用程序池的管道模式,尤其是如何理解"托管模型( ...

  3. 文件表单带数据一起提交spring_基于 Spring 实现管道模式的最佳实践

    管道模式(Pipeline Pattern) 是 责任链模式(Chain of Responsibility Pattern) 的常用变体之一.在管道模式中,管道扮演着流水线的角色,将数据传递到一个加 ...

  4. Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    Redis进阶实践之十八 使用管道模式提高Redis查询的速度 原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来 ...

  5. IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解

    IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员 ...

  6. 基于 Spring 实现管道模式的最佳实践

    本篇为设计模式第二篇,第一篇可见设计模式最佳套路 -- 愉快地使用策略模式 管道模式(Pipeline Pattern) 是责任链模式(Chain of Responsibility Pattern) ...

  7. 设计模式——管道模式(一)

    管道模式(Pipeline Pattern) 是 责任链模式(Chain of Responsibility Pattern)的常用变体之一.在管道模式中,管道扮演着流水线的角色,将数据传递到一个加工 ...

  8. 责任链模式(以及变种管道模式)的应用案例

    目录 一.前言 二.责任链简单使用 场景说明 1.前置代码准备 2.基本接口定义 3.业务节点处理代码 活动时效性检验 活动价格管控 活动风控校验 4.业务代码 5.测试与结果展示 测试代码 结果展示 ...

  9. ASP.NET 获取IIS应用程序池的托管管道模式

    asp.net 中怎样较为简单的获取网站程序池的托管管道模式 目前已知的方式是根据这个帖子https://github.com/kakalotte/... ,利用DirectoryEntry,但是程序 ...

最新文章

  1. 汇总Javascript各种判断脚本(javascript经典例子)
  2. Jenkins的卸载
  3. 两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍
  4. LeetCode 5. 最长回文子串(动态规划)
  5. 人脸方向学习(十):Face Detection-MobileNet_SSD解读
  6. EasyUI 1.5.1 美化主题大包 Insdep Theme 1.0.3 已发布,开源下载
  7. oracle数据库查询空间大小,Oracle查看数据库空间使用情况
  8. python 定时任务框架APScheduler
  9. c语言上机南开100题,全国计算机三级网络技术C语言南开上机南开100题(WORD版)
  10. 微商怎么做大做强,教你一套做微商全新打法
  11. 苹果支持WebRTC
  12. logo设计软件哪个好用?小白也能学会的logo设计小技巧
  13. 如何解决“应用程序无法启动,因为应用程序的并行配置不正确“问题
  14. ICC II setupfloorplan
  15. 天下谁人不识君,体面的礼品
  16. mysql按照音序排列_什么是按音序排列?
  17. 片上网络之路由器微结构
  18. Android知识点-圆角
  19. Parse 教程:网络后台基础
  20. CVPR 2021 | 超实用!住宅户型识别与重建技术来啦!

热门文章

  1. C#合并两个(多个)集合
  2. ubuntu快速保存网页图片
  3. 【网络】解释Http协议,URL,Http的格式。
  4. 为视图或函数指定的列名比其定义中的列多。
  5. 漫画:什么是 “幼态持续” ?
  6. 关于C++ variant 类型问题
  7. 第05章 Go语言函数(Go语言func)
  8. Android拍摄视频上传服务器及本地预览
  9. Qmsg酱实现QQ消息自由推送
  10. step7-- simatic -- PLC - MPI --