一、创建测试表

CREATE TABLE weather(
city varchar(80),
temp_lo int, --最低温度
temp_hi int, --最高温度
prcp real, --湿度
date date
);

二、创建触发器函数

create or replace function table_update_notify() returns trigger as $$
begin
perform pg_notify('table_update',json_build_object('table',TG_TABLE_NAME,'timestamp',current_timestamp)::text);
return new;
end;
$$ language plpgsql;

三、创建触发器

drop trigger if exists n_weather_u on weather;
create trigger n_weather_u after insert or update or delete on weather
for each statement execute procedure table_update_notify();

四、应用程序代码

代码有重连机制,数据库服务器停止或者网络断开应用程序不退出,数据库服务起来或者网络恢复后应用程序会自动重连并重新订阅消息

#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>
#include <errno.h>
#include <string.h>
#include <sys/time.h> static void exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit();
} int main(int argc,char **argv)
{
const char *conninfo;
PGconn *conn;
PGresult *res;
PGnotify *notify; conninfo = "hostaddr=192.168.147.1 port=5432 dbname=postgres user=postgres password=123456";
conn = PQconnectdb(conninfo);
if(PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr,"connection to database failed:%s",PQerrorMessage(conn));
exit_nicely(conn);
} res = PQexec(conn,"listen table_update");
if(PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr,"listen command failed:%s",PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
} PQclear(res); while()
{
//执行select 1命令来判断数据库连接是否正常,不正常则自动重连,并重新订阅通知
PGresult *res_getallrows;
res_getallrows = PQexec(conn,"select 1;");
// printf("PQresultStatus(res_getallrows)=%d\n",PQresultStatus(res_getallrows));
if(PQresultStatus(res_getallrows) != PGRES_TUPLES_OK)
{
conn = PQconnectdb(conninfo);
if(PQstatus(conn) != CONNECTION_OK)
{
usleep();
continue;
}
else
{
res = PQexec(conn,"listen table_update");
if(PQresultStatus(res) != PGRES_COMMAND_OK)
{
PQclear(res);
usleep();
continue;
}
}
} PQconsumeInput(conn);
while((notify = PQnotifies(conn)) != NULL)
{
fprintf(stderr,"async notify of '%s' received from backend PID %d,extra:%s\n",notify->relname,notify->be_pid,notify->extra);
PQfreemem(notify);
} usleep();
} fprintf(stderr,"Done.\n");
PQfinish(conn);
return ;
}

编译:gcc -I/opt/pgsql/include -L/opt/pgsql/lib -o test testpq.c -lpq

五、测试

服务器端执行sql

insert into weather values('nanjing',20,40,0.25,'2018-06-29');
update weather set temp_lo = 18 where city = 'nanjing';
delete from weather where city = 'nanjing'

应用程序获取表变化时间

postgresql获取表最后更新时间(通过发布订阅机制将消息发送给应用程序)的更多相关文章

  1. postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)

    通过触发器方式获取表最后更新时间,并将时间信息写入到另外一张表 一.创建测试表和表记录更新时间表 CREATE TABLE weather( city varchar(80), temp_lo int ...

  2. postgresql获取表最后更新时间(通过表磁盘存储文件时间)

    一.创建获取表更新时间的函数 --获取表记录更新时间(通过表磁盘存储文件时间) create or replace function table_file_access_info( IN schema ...

  3. Postgresql两表联结更新

    Postgresql两表联合更新近日使用Postgresql感到有点不好用,一个联合更新非要这样写语法才对:update d_routetripset name=b.name ,    descrip ...

  4. MYSQL查看数据表最后更新时间

    MYSQL查看数据表最后更新时间 - 拨云见日 - CSDN博客 https://blog.csdn.net/warnerwu/article/details/73352774 mysql> S ...

  5. Akka-Cluster(2)- distributed pub/sub mechanism 分布式发布/订阅机制

    上期我们介绍了cluster singleton,它的作用是保证在一个集群环境里永远会有唯一一个singleton实例存在.具体使用方式是在集群所有节点部署ClusterSingletonManage ...

  6. Redis发布订阅机制

    1. 什么是Redis Redis是一个开源的内存数据库,它以键值对的形式存储数据.由于数据存储在内存中,因此Redis的速度很快,但是每次重启Redis服务时,其中的数据也会丢失,因此,Redis也 ...

  7. dedecms 获取文章发布时间和获取文章最后更新时间

    文章发布时间:[field:senddate function=MyDate('m-d',@me)/] 文章最后更新时间:[field:pubdate function=MyDate('m-d',@m ...

  8. Redis 发布/订阅机制原理分析

    Redis 通过 PUBLISH. SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能.   这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播.实时 ...

  9. NATS—发布/订阅机制

    概念 发布/订阅(Publish/subscribe 或pub/sub)是一种消息范式,消息的发送者(发布者)不是计划发送其消息给特定的接收者(订阅者).而是发布的消息分为不同的类别,而不需要知道什么 ...

随机推荐

  1. [pwnable.kr] - wtf

    Q: I don't understand why my exploit is not working. I need your help. download : http://pwnable.kr/ ...

  2. Let's encrypt 通配域名DNS验证方式的证书自动更新

    通配符域名不同于一般的单域名证书. 为了解决之前一篇短文中通配域名通过DNS方式验证的证书自动更新问题. 需要使用到第三方域名提供商的API, 用于自动添加域名的TXT记录, 实现自动验证并完成证书更 ...

  3. django学习笔记(五)

    知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 内容详细: 1. Session 基于Cookie做用户验证时 ...

  4. JavaScript秒针转换00:00:00代码

    var str  = realFormatSecond(e.target.currentTime);   console.log(e.target.scrollTop); //1255256252 c ...

  5. Zookeeper学习笔记(中)

    Zookeeper学习笔记(中) Zookeeper的基本原理和基本实现 深入了解ZK的基本原理 ZK的一致性: ZAB 协议: Zookeeper 原子消息广播协议 ZK通过选举保证 leader ...

  6. CSS3之mix-blend-mode

    <!-- more --> 在线编辑demo 属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合. mix-blend-mode: normal; //正常 mix-bl ...

  7. vscode 编写Markdown文件

    vscode使用Markdown文档编写   首先安装vscode工具,具体的使用可以参考之前的博文:<Visual Studio Code教程:基础使用和自定义设置> VScode已经默 ...

  8. MySQL的运行模式及一些特性,引擎、事务、并发控制、优化总结

    一 MySQL总体架构 上图是<高性能MySQL>中对MySQL总体架构的描述,客户端对服务端的连接有很多条,有一个专门的处理组件,类似tomcat使用线程池处理请求.解析器负责解析sql ...

  9. win10系统迁移到新的硬盘

    笔记本换个硬盘,但是程序员在开发中需要各种环境配置,不想重装系统,重新系统容易,但是装各种软件和配各种环境就比较麻烦了,所以笔记本加固态硬盘,可以不用重装,直接"系统迁移"到新的硬 ...

  10. python-unittest生成报告的几种方式

    import unittest suite = unittest.TestSuite() #构造套件 #按测试方法添加 suite.addTest(测试类名('方法名')) suite.addTest ...