无法立即接收多个通知在Npgsql中

4

今天我写了以下代码,与名为Npgsql的PostgreSQL C#库配合使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;

namespace PostgreSQLNotificationsTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=my_password;Database=helper_db.psql;SyncNotification=true"))
            {
                conn.Notification += OnNotification;
                conn.Open();
                using (var command = new NpgsqlCommand("listen notifytest;", conn))
                {
                    command.ExecuteNonQuery();
                }
                Console.ReadLine();
            };
        }

        private static void OnNotification(object sender, NpgsqlNotificationEventArgs e)
        {
            Console.WriteLine("event handled: " + e.AdditionalInformation);
        }
    }
}

然后我执行以下步骤:

createdb.exe -h 127.0.0.1 -p 5432 -U postgres -W helper_db.psql

psql.exe -h 127.0.0.1 -p 5432 -U postgres -W helper_db.psql

create table helper(first text primary key, second integer);

注:以上内容为涉及IT技术的命令行操作。
CREATE OR REPLACE FUNCTION nf() RETURNS TRIGGER AS $$
BEGIN
    PERFORM pg_notify('notifytest', format('INSERT %s %s', NEW.first, NEW.second));
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER any_after AFTER INSERT OR UPDATE OR DELETE ON helper FOR EACH ROW EXECUTE PROCEDURE nf();

插入到helper表中,值为('first', 10), ('second', 20);

在C#项目中,我得到以下输出:

事件已处理:INSERT first 10

没有"事件已处理:INSERT second 20"。只有在进行下一操作,如"从helper表中删除"时才会收到它。

为什么?


你应该收到通知。我认为接收通知的部分存在一些问题。我会检查一下。 - Francisco Junior
2个回答

2

更新(2015-02-27):此错误已在我们的github主分支上得到修复。请注意,主分支是我们即将推出的3.0版本,可能存在一些我们正在解决的错误。请尝试并告诉我是否有效。

这是Npgsql中的一个错误。我们正在努力修复它。有关更多信息,请查看此pull请求:https://github.com/franciscojunior/Npgsql2/pull/46,特别是提交:https://github.com/glenebob/Npgsql2/commit/98fd469048a20119755777ce3a8ffc4397f4a114

但是,我们正在尝试其他方法来解决此问题。请注意,仅当您在非常短的时间内发送多个通知时才会出现此问题。如果在通知之间保持1或2秒的间隔,则它们将被正确传递。

一旦我们修复它,我会在这里更新我的答案。

非常抱歉这个问题可能给您带来的所有不便。


2
除非您的客户端库支持检查网络套接字中的缓冲数据,否则接收通知的唯一方法是在套接字上触发其他活动。
许多应用程序定期发送空查询字符串(“”)来执行此操作。
如果客户端库支持并且您没有使用SSL,则可以定期在连接上调用某种checkForNotifications()函数。这在PgJDBC中是可能的,但我不知道nPgSQL,所以我只能建议您查看相关文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接