掌握 PostgreSQL 的 LISTEN 和 NOTIFY 机制:实时数据库通知的艺术

掌握 PostgreSQL 的 LISTEN 和 NOTIFY 机制:实时数据库通知的艺术

引言

在现代应用架构中,数据库扮演着核心角色,而 PostgreSQL 以其强大的功能和灵活性成为开发者的首选。PostgreSQL 的 LISTEN 和 NOTIFY 机制为开发者提供了一种在数据库层面进行实时通信的手段。本文将深入探讨这一机制的工作原理,并通过实际代码示例,指导如何利用 LISTEN 和 NOTIFY 实现数据库的实时通知功能。

PostgreSQL LISTEN 和 NOTIFY 机制概述

PostgreSQL 的 LISTEN 和 NOTIFY 是一种内置的消息通知系统,允许应用程序订阅数据库事件,并在事件发生时接收通知。

LISTEN:注册通知

LISTEN 命令允许客户端在特定的通道上注册以接收通知。这类似于订阅一个主题,当有消息发布到该主题时,所有订阅者都会收到通知。

NOTIFY:发送通知

NOTIFY 命令用于向所有监听指定通道的客户端发送消息。这个消息可以是无载荷的简单通知,也可以携带额外信息的载荷。

实时数据库通知的重要性
  • 减少轮询:传统的轮询机制会不断查询数据库以获取更新,这既浪费资源又影响性能。LISTEN 和 NOTIFY 提供了一种更为高效的解决方案。
  • 提高响应性:通过实时接收数据库变更通知,应用程序可以快速响应数据变化,提升用户体验。
  • 简化架构:利用数据库层面的通知机制,可以简化应用程序架构,减少不必要的中间件。
如何使用 LISTEN 和 NOTIFY

步骤 1:创建触发器函数

触发器函数是发送通知的核心,通常在数据变更时调用。

CREATE OR REPLACE FUNCTION notify_channel()
RETURNS TRIGGER AS $$
BEGINPERFORM pg_notify('my_channel', 'Data has changed.');RETURN NEW;
END;
$$ LANGUAGE plpgsql;

步骤 2:创建触发器

触发器定义了何时调用触发器函数,例如在数据表更新后。

CREATE TRIGGER my_table_trigger
AFTER UPDATE ON my_table
FOR EACH ROW
EXECUTE FUNCTION notify_channel();

步骤 3:监听通道

应用程序或客户端使用 LISTEN 命令订阅通知。

LISTEN my_channel;

步骤 4:接收通知

在客户端应用程序中,实现逻辑以接收并处理通知。

示例:使用 psql 接收通知

psql 中,可以使用以下命令等待通知:

SELECT pg_notify('my_channel', 'notification payload');
示例:使用 Python 和 psycopg2 接收通知

在 Python 中,使用 psycopg2 库可以这样接收通知:

import psycopg2
import selectconn = psycopg2.connect("dbname=mydb user=myuser")
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
cur = conn.cursor()
cur.execute("LISTEN my_channel;")while True:if select.select([conn], [], [], 5) == ([], [], []):print("Timeout waiting for notification...")else:conn.poll()while conn.notifies:notify = conn.notifies.pop(0)print(f"Got NOTIFY: {notify.pid}, {notify.channel}, {notify.payload}")
注意事项
  • 确保客户端库支持异步通知。
  • NOTIFY 只能在事务提交后发送。
  • LISTEN 命令在当前事务中有效,如果需要跨事务监听,需要在每个事务中重复该命令。
结语

通过本文的学习,您应该已经掌握了 PostgreSQL 的 LISTEN 和 NOTIFY 机制,以及如何将这一机制应用到实际开发中。实时数据库通知不仅提升了应用程序的响应速度,还简化了系统架构。随着您对 LISTEN 和 NOTIFY 更深入的理解和应用,您将能够构建出更加高效和动态的应用程序。

附录:进一步学习资源
  • PostgreSQL 官方文档关于 LISTEN 和 NOTIFY
  • psycopg2 库文档

本文不仅提供了 LISTEN 和 NOTIFY 的基础和高级概念,还通过实际的代码示例,帮助读者快速上手 PostgreSQL 中的实时通知编程。随着您对这一机制的深入理解和实践,您将能够编写出更加高效和健壮的数据库交互逻辑。

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

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

相关文章

AI绘画Stable Diffusion - 功能性LoRA推荐!年龄调整、衣服增减、人物距离调整一键搞定!

大家好,我是画画的小强 AI绘画工具 **Stable Diffusion(SD)**以其强大的图片生成能力被越来越多的爱好者使用,而LoRA技术,作为SD中的一个关键组件,为创作者提供了更多的灵活性和控制力。今天,我…

C#面:详细举例阐述什么是多态性?

多态性是面向对象编程中的一个重要概念,它允许一个对象可以以多种不同的方式工作。在C#中,多态性通过虚函数来实现。 举个例子来说明多态性的概念。假设我们有一个基类Animal,它有一个虚方法MakeSound(),并…

pandas将dataframe展开/拉伸成一个series

pandas提供了一个函数实现这个操作: dataframe.stack()示例程序: import pandas as pd import numpy as npdf pd.DataFrame(np.random.randint(0, 10, size(2, 4)), columns[col_1, "col_2", "col_3", "col_4"]) # 展…

Arduino 红外线控制器

Arduino 红外线控制器 红外线小车 You’ve likely encountered the infrared remote controller, also known as the IR remote controller, while using home electronic devices like TVs and air conditioners… In this tutorial, we are going to learn how to use infra…

Jedis基本操作

Jedis库提供了对Redis数据库的丰富操作,包括但不限于基本的CRUD操作、事务、管道、发布订阅、哈希、列表、集合、有序集合操作等。由于篇幅限制,我将介绍一些最常用的方法,并为每个方法提供示例说明。 Jedis连接和基础操作 连接Redis Jedi…

【机器学习】基于Gumbel-Sinkhorn网络的“潜在排列问题”求解

1. 引言 1.1.“潜在排列”问题 本文将深入探索一种特殊的神经网络方法,该方法在处理离散对象时展现出卓越的能力,尤其是针对潜在排列问题的解决方案。在现代机器学习和深度学习的领域中,处理离散数据一直是一个挑战,因为传统的神经网络架构通常是为连续数据设计的。然而,…

scroll-view标签里引入弹窗层级问题

小程序scroll-view标签里引入弹窗(model)层级问题 在使用scroll-view组件时,在其内部嵌套了一个弹窗(如modal),但是弹窗无法正确显示在最上层。这是因为scroll-view默认的层级(z-index&#xf…

自然语言处理(NLP)—— Rasa中config.yml

调整你的NLU模型:选择合适的处理管道 在启动一个新的项目时,Rasa 会为你提供一个建议的自然语言理解(NLU)配置。然而,随着项目的不断发展,你可能需要对配置进行调整,以更好地适应不断扩展的训练…

使用JAVA代码实现发送订阅消息以及模板消息

今天写了一个商品到货提醒的job任务,具体效果如下 这里用到了微信的发送订阅消息,主要代码是这一块的,最后我把发送了消息的订单存到表里,因为是定时任务,大家可不存 发送订阅消息 | 微信开放文档 /*** 微信平台-商品…

【系统架构师】-论文-论软件可靠性分析与设计

1、摘要: 我就职于一家在线教育互联网公司,公司为了深耕中、小学的教学资源消费市场,决定在 2017 年3月份决定升级一款教学资源搜索与下载产品,“*校通”。我有幸作为该产品系统架构师,负责了系统架构工作。本文以该产品升级的可靠…

玩转Linux dd命令:备份与恢复指南

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 玩转Linux dd命令:备份与恢复指南 前言简介基本语法常用选项 示例3. 高级用法 性能优…

python-九九乘法表(对齐式1)

[题目描述] 输出九九乘法表,输出格式见样例。输入格式: 无输出格式: 输出乘法表,对齐方式见样例输出。样例输入 无样例输出 来源/分类(难度系数:一星) 完整代码展示: #对齐式1 a[] …

夏季生鲜防损规范

一、引言 在夏季,高温与高湿度的环境条件对生鲜商品的品质和保存构成了严峻挑战,生鲜商品由于其天然的易腐特性,在夏季极易发生变质和损耗,那么超市夏季生鲜防损规范主要包含哪几个方面呢? 二、生鲜商品分类及特点 …

使用 MediaSession API 控制 Web 媒体播放

在现代的 web 应用程序中,多媒体播放已经成为了很常见的功能。为了提供更好的用户体验,我们可以使用 MediaSession API 来控制网页中的媒体播放。 什么是 MediaSession API? MediaSession API 允许网页控制媒体会话,例如音频和视…

C/C++混合编译说明

C调用C的函数: C的头文件中声明,被C调用的函数,是以C的方式编译 C的头文件: #ifdef __cplusplus extern "C" { #endif void func_c(void); #ifdef __cplusplus } #endif C调用C的函数: C的源文件中声明&#xff…

Windows操作防火墙命令

Windows操作防火墙命令 启用防火墙: netsh advfirewall set allprofiles state on禁用防火墙: netsh advfirewall set allprofiles state off添加新的入站规则允许端口80(HTTP): netsh advfirewall firewall add r…

Python生成器嵌套太多?使用yield from秒变简洁!

目录 1、yield from基础概念 🌐 1.1 yield关键字回顾 1.2 yield from引入动机 2、yield from深入解析 🧭 2.1 语法与用法 2.2 传递生成器控制权 2.3 与迭代器的高效整合 2.4 与传统yield对比优势 3、实战应用示例 📈 3.1 链接多个生成器 3.2 简化递归生成器实…

Git之checkout/reset --hard/clean -f区别(四十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Elasticsearch:倒数排序融合 - Reciprocal rank fusion - 8.14

警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。语法可能会在正式发布之前发生变化。Elastic 将努力修复任何问题,但技术预览中的功能不受官方正式发布功能的支持 SLA 约束。 倒数排序融合 (reciprocal rank fusion - RRF) 是一…

【数学】Leetcode 50. Pow(x, n)【中等】

Pow(x, n) 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000 示例 2: 输入:x 2.10000, n 3 输出&#xf…