Postgres Listener - 拉出最后插入/删除的行

时间:2017-01-20 10:56:47

标签: java postgresql pljava

我正在尝试用Java创建数据库侦听器( postgres )。每次用户插入或删除表的条目时,我都希望分别接收插入或删除的值。

为此,我创建了一个触发器,如下所示,在插入后运行并返回感兴趣的相应行字段。(我还创建了一个类似的删除项)。

CREATE OR REPLACE FUNCTION notify() RETURNS trigger AS $insert$
    DECLARE
        command_string text;
    BEGIN
        command_string := format('{"data":"%s"}',NEW.data);
        PERFORM pg_notify('demo', command_string);
        RETURN NEW;
    END; 
$insert$ LANGUAGE plpgsql;

问题是通过使用函数 pg_notify(..),我只能在Java应用程序中将值检索为String。理想情况下,我希望有一个能够返回序列化数据的触发器,保持其各自的类型(byte [],Integer,ect)

为此,我考虑使用Pljava:https://github.com/tada/pljava/wiki。虽然我能够创建所需的触发器,但我不知道每次删除或插入行时都会从我的java应用程序中提取值。

有关如何构建此功能的任何想法?

为了完成,下面是我用来从pg_notify中检索值的代码。

@Override
public void run() {
    while (running) {
        try {
            try ( // Dummy Pull 
                    Statement stmt = dbConnection.createStatement()) {
                ResultSet rs = stmt.executeQuery("SELECT 1");
                rs.close();
            }
            // Retreive Notifications
            PGNotification notifications[] = pgconn.getNotifications();
            if (notifications != null) {
                for (PGNotification notification : notifications) {
                    logger.debug("Got notification: " + notification.getName());
                    logger.debug("Got payload: " + notification.getParameter());
                }
            }
            Thread.sleep(pollingInterval);
        } catch (InterruptedException | SQLException ex) {
            logger.fatal("WATCHER ABORTED",ex);
        }
    }
}

0 个答案:

没有答案