当前位置:   article > 正文

监听数据库数据变化_监听 数据库表的变化 c++ builder

监听 数据库表的变化 c++ builder

pgsql:

-- 监听channelA频道
LISTEN channelA;
-- 向channelA广播消息
NOTIFY channelA, 'test-message';
-- 监听channelA频道
PERFORM pg_listen('channelA');
-- 向channelA广播消息
PERFORM pg_notify('channelA', 'test-message');

1.数据库中表添加触发器方法

  1. CREATE OR REPLACE FUNCTION "public"."add_channel"()
  2. RETURNS "pg_catalog"."trigger" AS $BODY$
  3. declare
  4. begin
  5. PERFORM pg_notify('channela'::text,row_to_json(NEW)::text);
  6. return new;
  7. end;
  8. $BODY$
  9. LANGUAGE plpgsql VOLATILE
  10. COST 100

2. 绑定表与触发器关联

CREATE TRIGGER add_channel AFTER INSERT ON 表名称 FOR EACH ROW EXECUTE FUNCTION 触发器方法名();

3 java 中代码 

  1. @SneakyThrows
  2. public static void init(String[] args) {
  3. Class.forName("org.postgresql.Driver");
  4. String url = "jdbc:postgresql://xxxx";
  5. Connection conn = DriverManager.getConnection(url, "xxx", "xxxx");
  6. PGConnection pgconn = conn.unwrap(PGConnection.class);
  7. // 监听channelA频道
  8. Statement stmt = conn.createStatement();
  9. stmt.execute("LISTEN channela");
  10. stmt.close();
  11. scheduledExecutorService.scheduleAtFixedRate(() -> {
  12. try {
  13. List<PGNotification> result = Lists.newArrayList(pgconn.getNotifications());
  14. result.forEach(item -> {
  15. System.out.println(JSON.toJSONString(item));
  16. });
  17. } catch (SQLException e) {
  18. }
  19. }, 0, 1, TimeUnit.SECONDS);
  20. }

注意点:channel 在触发器中调用时,大小写需要注意

适用

没有其他中间件,好维护。

可以知晓一个业务数据的前后变化的同时,不与之前的业务有联系,耦合程度降低。

mysql :

前提 要开启bin-log 日志 

  1. <dependency>
  2. <groupId>com.github.shyiko</groupId>
  3. <artifactId>mysql-binlog-connector-java</artifactId>
  4. <version>0.21.0</version>
  5. </dependency>
  1. /**
  2. * 连接mysqlBinLog
  3. */
  4. public void init() {
  5. BinaryLogClient client = new BinaryLogClient("127.0.0.1", 3306, "root", "123456");
  6. client.setServerId(2);
  7. client.registerEventListener(event -> {
  8. EventData data = event.getData();
  9. if (data instanceof TableMapEventData) {
  10. System.out.println("Table:");
  11. TableMapEventData tableMapEventData = (TableMapEventData) data;
  12. System.out.println(tableMapEventData.getTable());
  13. }
  14. if (data instanceof UpdateRowsEventData) {
  15. System.out.println("Update:");
  16. System.out.println(data);
  17. } else if (data instanceof WriteRowsEventData) {
  18. System.out.println("Insert:");
  19. System.out.println(data);
  20. } else if (data instanceof DeleteRowsEventData) {
  21. System.out.println("Delete:");
  22. System.out.println(data);
  23. }
  24. });
  25. try {
  26. client.connect();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/85701
推荐阅读
相关标签
  

闽ICP备14008679号