powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по Notify/Listen
13 сообщений из 13, страница 1 из 1
Вопрос по Notify/Listen
    #39271112
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал пример на c#, который делает Listen mymsg;

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        StartListening();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        StopListening();
    }

    private const string SERVER = "localhost";
    private const string DATABASE = "testdb";
    private const string USER = "postgres";
    private const string PASSWORD = "postgres";

    static string GetConnectionString()
    {
        var csb = new NpgsqlConnectionStringBuilder
        {
            Host = SERVER,
            Database = DATABASE,
            Username = USER,
            Password = PASSWORD
            //, Syncnotification = true
        };
        return csb.ConnectionString;
    }

    static NpgsqlConnection _notificationConnection;
    static void StartListening()
    {
        _notificationConnection =
           new NpgsqlConnection(GetConnectionString());
        _notificationConnection.Open();

        string sql = "listen mynotification";

        using (NpgsqlCommand command = new NpgsqlCommand(sql,
           _notificationConnection))
        {
            command.ExecuteNonQuery();
        }

        _notificationConnection.Notification +=
           PostgresNotification;
    }

    static void StopListening()
    {
        string sql = "unlisten mynotification";

        _notificationConnection.Notification -=
           PostgresNotification;

        using (NpgsqlCommand command = new NpgsqlCommand(sql,
           _notificationConnection))
        {
            command.ExecuteNonQuery();
        }

        _notificationConnection.Close();
    }

    static int notifications = 0;
    static void PostgresNotification(object sender,
       NpgsqlNotificationEventArgs e)
    {
        Console.WriteLine("-------Notification {0} -->", notifications++);
        Console.WriteLine("  DATA {0}", e.AdditionalInformation);
        Console.WriteLine("  CHANNEL {0}", e.Condition);
        Console.WriteLine("  PID {0}", e.PID);
    }

    static void TriggerNotification()
    {
        try
        {
            string sql = @"notify mynotification, 'This is some extra data:" + notifications.ToString() + @"'";

            using (NpgsqlCommand command = new NpgsqlCommand(sql,
           _notificationConnection))
            {
                command.ExecuteNonQuery();
            }
        }
        catch (Exception x)
        {
            Console.WriteLine("{0}", x.ToString());
        }
    }
    private void button5_Click(object sender, EventArgs e)
    {
        TriggerNotification();
    }
}



Но пока не прикрутил таймер по которому вызывается на той же коннекции пустой select 1 - нотификации, генерируемые в триггере на сервере не приходят сами по себе.

Вопрос: фактически этот пустой запрос является запросом на получение нотификаций.
Без этого никак?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private static void Check(Object stateInfo)
        {
            try
            {
                string sql = @"select 1";

                using (NpgsqlCommand command = new NpgsqlCommand(sql, _notificationConnection))
                {
                    command.ExecuteNonQuery();
                }
            }
            catch (Exception x)
            {
                Console.WriteLine("{0}", x.ToString());
            }
        }
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39271135
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Вам надо в профильный форум по C#.
Если хотите помощи в рамках Postgres'а, то оформите это всё в чистом SQL-е.
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39271147
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovРолг Хупин,

Вам надо в профильный форум по C#.
Если хотите помощи в рамках Postgres'а, то оформите это всё в чистом SQL-е .

ну что за глупости, где вы в наши дни видели что-то в чистом виде.
Вопрос не относится к шарпу, он относится к нотификациям.
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39271151
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Не вызывая запросов в базу вы нотификации не получите.
Механизм нотификаций рассчитан на приложение которое и так с базой работает само по себе и вызывает запросы а не на приложение которое только ждет нотификации и после этого начинает что то делать.
Так что да - вам надо периодически вызывать select 1 или любой другой запрос в базу чтобы их получать.


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39271154
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

да, всё ясно, спасибо
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39271161
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос:

если предположим 200-300 подключенных клиентских приложений и все - постоянные слушатели нотификаций и одновременно нотификаторы - это нормальная практика?

Нотификации в этом случае на уровне изменения прикладных объектов, т.е. изменений в мастер таблице и в самом приложении.
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39271164
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинЕще вопрос:

если предположим 200-300 подключенных клиентских приложений и все - постоянные слушатели нотификаций и одновременно нотификаторы - это нормальная практика?

Нотификации в этом случае на уровне изменения прикладных объектов, т.е. изменений в мастер таблице и в самом приложении.

Это архитектурно кривое решение (IMHO конечно).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39271173
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukРолг ХупинЕще вопрос:

если предположим 200-300 подключенных клиентских приложений и все - постоянные слушатели нотификаций и одновременно нотификаторы - это нормальная практика?

Нотификации в этом случае на уровне изменения прикладных объектов, т.е. изменений в мастер таблице и в самом приложении.

Это архитектурно кривое решение (IMHO конечно).

--
Maxim Boguk
www.postgresql-consulting.ru

Собственно решение я и не описывал.

А сама ситуация с точки зрения реализации - успеет ли обработать сервер все запросы и т.д.?
То есть запрос на получение - каждую секунду от каждого приложения, отправка нотификации не так часто от любого приложения, может раз в 5-10 сек.

Хорошо, какое решение лучше?
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39271466
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинMaxim Bogukпропущено...


Это архитектурно кривое решение (IMHO конечно).

--
Maxim Boguk
www.postgresql-consulting.ru

Собственно решение я и не описывал.

А сама ситуация с точки зрения реализации - успеет ли обработать сервер все запросы и т.д.?
То есть запрос на получение - каждую секунду от каждого приложения, отправка нотификации не так часто от любого приложения, может раз в 5-10 сек.

Хорошо, какое решение лучше?

В режиме запрос раз в секунду и нотификации раз в 5-10 секунду думаю проблемы не будет особой на нормальном сервере.

А про какое решение лучшее - вы сначала объясните что вы пытаетесь сделать то и зачем.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39271501
aceton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Напишите dll на С (c C# подружить не проблема). Внутри используйте родную libpq. Устанавливайте соединение с БД, подписывайтесь на соответствующие уведомления, получайте сокет соединения и устанавливайте на него слушатель на переход в режим чтения (если без напряга, то каким-нибудь libev, иначе select/poll/epoll в зависимости от оси). В колбэке на сие событие высасываете из постгреса все доступные уведомления. Всё прилетит без всяких select'ов.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вопрос по Notify/Listen
    #39837935
DrinkinSSTI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть приложение, которое подписано на изменения в БД.

Подключаюсь к БД через pgAdmin. Выполняю запросы (по очереди):
Код: sql
1.
SELECT pg_notify('канал', (SELECT now())::TEXT);


Код: sql
1.
NOTIFY канал;



Оба выполняются успешно, об это пишется в pgAdmin. Но в приложение эти оповещения приходят в течении минуты. Т.е. могут сразу прийти, а могут через минуту.
Сервер:
PostgreSQL 9.5.18, compiled by Visual C++ build 1800, 64-bit

Не подскажите куда смотреть?
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39837977
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrinkinSSTIДобрый день. Есть приложение, которое подписано на изменения в БД.

Подключаюсь к БД через pgAdmin. Выполняю запросы (по очереди):
Код: sql
1.
SELECT pg_notify('канал', (SELECT now())::TEXT);


Код: sql
1.
NOTIFY канал;



Оба выполняются успешно, об это пишется в pgAdmin. Но в приложение эти оповещения приходят в течении минуты. Т.е. могут сразу прийти, а могут через минуту.
Сервер:
PostgreSQL 9.5.18, compiled by Visual C++ build 1800, 64-bit

Не подскажите куда смотреть?

Так это вопрос к вашему приложению как оно нотифаи от базы вычитывает... он же всеравно pull а не push в реальности.
Так что это документацию к вашей библиотеке читать надо.
В простейшем случае например вот так вот "With the libpq library, the application issues LISTEN as an ordinary SQL command, and then must periodically call the function PQnotifies to find out whether any notification events have been received.".
...
Рейтинг: 0 / 0
Вопрос по Notify/Listen
    #39838159
DrinkinSSTI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел решение вот тут: https://www.npgsql.org/doc/wait.html

Сделал так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
private static void forNotify()
{
  Exception prevEx = null;

  while (!stop)
  {
    try
    {
      Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection("Строка подключения");

      conn.Open();

      conn.Notification += (o, e) =>
      {
        // для отладки разницы времени
        // в PGSQL делаю select pg_notify('channel', (SELECT now())::TEXT);
        Debug.Print($"{DateTime.Now.ToLongTimeString()}\t" +
                          $"{e.Condition.ToString()}\t" +
                          $"{e.AdditionalInformation}");
        // далее что надо
      };

      using (var cmd = new Npgsql.NpgsqlCommand("LISTEN channel", conn))
      {
        cmd.ExecuteNonQuery();
      }

      prevEx = null;

      while (true)
        conn.Wait();

    }
    catch (Exception ex)
    {
      if (prevEx is null ||
          prevEx.GetType() != ex.GetType())
      {
        prevEx = ex;
        Logger.Error(ex);
      }

      Thread.Sleep(1000);
    }
}



И запускаю так:
Код: c#
1.
new Thread(forNotify).Start();
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по Notify/Listen
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]