postgresql 创建listen notify .net core6.0监听连接

背景:数据库某张表定时有第三方更新到实时表里,收到数据更新以后,WEBSOCKET发送前端

-- 创建一个发送通知的函数

CREATE OR REPLACE FUNCTION notify_event(event_name text) RETURNS void AS $$

BEGIN

PERFORM pg_notify(event_name, '');

END;

$$ LANGUAGE plpgsql;

-- 创建一个触发器,在数据变化时调用通知函数

CREATE OR REPLACE FUNCTION notify_trigger() RETURNS trigger AS $$

BEGIN

PERFORM notify_event('data_changed');

RETURN NEW;

END;

$$ LANGUAGE plpgsql;

-- 在需要监听的表上创建触发器

CREATE TRIGGER data_change_trigger

AFTER INSERT OR UPDATE OR DELETE ON river_area

FOR EACH ROW

EXECUTE FUNCTION notify_trigger();

.net core创建一个后台运行服务

using System;

using System.Threading;

using System.Threading.Tasks;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.DependencyInjection;

using Microsoft.Extensions.Hosting;

using Npgsql;

namespace Pipe.BLL

{

public class TableUpdateListenerService : BackgroundService

{

private readonly IServiceProvider _services;

public TableUpdateListenerService(IServiceProvider services)

{

_services = services;

}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)

{

using var scope = _services.CreateScope();

var serviceProvider = scope.ServiceProvider;

var connectionString = serviceProvider.GetRequiredService<IConfiguration>().GetConnectionString("LocalNpgsqlConnection");

using var conn = new NpgsqlConnection(connectionString);

await conn.OpenAsync(stoppingToken);

using var cmd = new NpgsqlCommand("listen data_changed", conn);

cmd.ExecuteNonQuery();

conn.Notification += (sender, e) =>

{

Console.WriteLine($"Received table update notification: {e.Payload}");

// 在这里执行相应的操作,处理接收到的通知

};

while (!stoppingToken.IsCancellationRequested)

{

using var transaction = conn.BeginTransaction();

await transaction.CommitAsync();

await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken); // 可以选择适当的延迟时间

}

}

}

}

startup.cs注册下服务 services.AddHostedService<TableUpdateListenerService>();

psql 发送测试。

UPDATE "public"."river_area" SET "objectid" = 5 WHERE "gid" = 3;

NOTIFY data_changed, 'Your notification payload here'; 测试通过

相关推荐
minji...14 分钟前
MySQL数据库 (五) MySQL表的约束(上),非空约束,默认值约束,零填充约束,主键约束,符合主键
数据库·mysql·表的约束·主键约束·非空约束·复合主键·零填充约束
拾贰_C31 分钟前
【python | installation 】python 安装 | Windows | 命令使用
linux·数据库·ubuntu
贺今宵43 分钟前
Vue 3 + Capacitor 使用jeep-sqlite,web端使用本地sqlite数据库
前端·数据库·vue.js·sqlite·web
列星随旋1 小时前
MySQL面经整理
数据库·mysql
AllData公司负责人1 小时前
大模型赋能AllData数据中台,系列升级|通过联合智谱大模型与Chat2DB开源项目,建设Text2SQL生产场景全新体验的数据源平台!
数据库·人工智能·text2sql·数据中台·数据源·chat2db·智谱大模型
minji...1 小时前
MySQL数据库 (四) MySQL的数据类型,tinyint,float,decimal,枚举enum和集合set
数据库·mysql·tinyint·enum·decimal·varchar·bit
阿演2 小时前
DataDjinn 新版本更新:国产数据库支持、连接树体验、AI 查询和表格编辑继续增强
数据库·人工智能·ai·ai编程
一只fish2 小时前
Oracle官方文档翻译《Database Concepts 26ai》附录-术语表
数据库·oracle
一只fish3 小时前
Oracle官方文档翻译《Database Concepts 26ai》第23章-数据库开发者概念
数据库·oracle
todoitbo3 小时前
从 MySQL 到 KingbaseES:Database、Schema、User 一次讲透
数据库·mysql·国产数据库·kingbasees