3

今日、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

テーブル ヘルパーを作成します (最初のテキスト主キー、2 番目の整数);

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();

ヘルパー値に挿入します('first', 10), ('second', 20);

C# プロジェクトでは、次の出力が得られます。

イベント処理: INSERT 最初の 10

「イベント処理: INSERT 20 秒」はありません。「ヘルパーから削除」のような次の操作をしたときだけ受け取ります。

なんで?

4

2 に答える 2

2

クライアント ライブラリがバッファリングされたデータのネットワーク ソケットのチェックをサポートしていない限り、通知を受け取る唯一の方法は、ソケットで他のアクティビティをトリガーすることです。

多くのアプリケーションは、これを行うために定期的に空のクエリ文字列 ( "") を送信します。

クライアント ライブラリが SSL をサポートしていて、SSL を使用していない場合は、接続である種の checkForNotifications() 関数を定期的に呼び出すことができる場合があります。これは PgJDBC で可能ですが、私は nPgSQL を知りません。そのため、ドキュメントを確認することをお勧めします。

于 2013-08-09T12:23:31.443 に答える