Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по Notify/Listen / 13 сообщений из 13, страница 1 из 1
09.07.2016, 16:25
    #39271112
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Notify/Listen
Сделал пример на 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
09.07.2016, 17:58
    #39271135
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Notify/Listen
Ролг Хупин,

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

--
Maxim Boguk
www.postgresql-consulting.ru

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

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

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


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

--
Maxim Boguk
www.postgresql-consulting.ru

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

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

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

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

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

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

Подключаюсь к БД через 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
16.07.2019, 17:11
    #39837977
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Notify/Listen
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
17.07.2019, 08:59
    #39838159
DrinkinSSTI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по Notify/Listen
Нашел решение вот тут: 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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по Notify/Listen / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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