[펌] Reactive PostgreSQL : sql 샘플

** 출처
https://dzone.com/articles/reactive-postgresql-listen-to-notifications-with-s
http://coussej.github.io/2015/09/15/Listening-to-generic-JSON-notifications-from-PostgreSQL-in-Go/index.html

  1. Notification/Listener 단순 테스트
    LISTEN virtual;
    NOTIFY virtual;
    -- Asynchronous notification "virtual" received from server process with PID 8448.
    NOTIFY virtual, 'This is the payload';
    -- Asynchronous notification "virtual" with payload "This is the payload" received from server process with PID 8448.
    
  2. products 테이블로 테스트 (insert/update/delete)
    2-1) products 테이블 생성

    CREATE TABLE products (
      id SERIAL,
      name TEXT,
      quantity FLOAT
    );
    

    2-2) event 발생하는 procedure 생성

    CREATE OR REPLACE FUNCTION notify_event() RETURNS TRIGGER AS $$
    
        DECLARE 
            data json;
            notification json;
        
        BEGIN
        
            -- Convert the old or new row to JSON, based on the kind of action.
            -- Action = DELETE?             -> OLD row
            -- Action = INSERT or UPDATE?   -> NEW row
            IF (TG_OP = 'DELETE') THEN
                data = row_to_json(OLD);
            ELSE
                data = row_to_json(NEW);
            END IF;
            
            -- Contruct the notification as a JSON string.
            notification = json_build_object(
                              'table',TG_TABLE_NAME,
                              'action', TG_OP,
                              'data', data);
            
                            
            -- Execute pg_notify(channel, notification)
            PERFORM pg_notify('events',notification::text);
            
            -- Result is ignored since this is an AFTER trigger
            RETURN NULL; 
        END;
        
    $$ LANGUAGE plpgsql;
    

    2-3) products 테이블에 trigger 생성 (procedure 연결)

    CREATE TRIGGER products_notify_event
    AFTER INSERT OR UPDATE OR DELETE ON products
        FOR EACH ROW EXECUTE PROCEDURE notify_event();
    

    2-4) 테스트

    triggers=# LISTEN events;
    LISTEN
    triggers=# INSERT INTO products(name, quantity) VALUES ('Something', 99999);
    INSERT 0 1
    Asynchronous notification "events" with payload "{"table" : "products", "action" : "INSERT", "data" : {"id":50,"name":"Something","quantity":99999}}" received from server process with PID 24131.
    triggers=#
    

이것을 pgJDBC를 통해 spring backend에서 reactive 처리를 할 수 있다.
예를 들어, 데이터가 들어오면 그때 어떤 연계작업(가령 통계데이터 갱신)을 하던지..

pg + jdbc + spring 소스코드 탐색중!

이것뿐인가? (-_-)
https://jdbc.postgresql.org/documentation/head/listennotify.html

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: