Как получить какие-либо изменения в базе данных MySQL в режиме реального времени из клиентского кода в функции времени? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть база данных с таблицей записей журнала, которая выглядит следующим образом:

+-----------+------------------------+--------+
| Timestamp | Symbol_name            | Status |
+-----------+------------------------+--------+
|         1 | Group2                 |      1 |
|         2 | Group1-Device3-Signal1 |      1 |
|         3 | Group2-Device1-Signa13 |      0 |
+-----------+------------------------+--------+

Где Timestamp - это double, Symbol_name - это varchar, а Status - этоint.

Записи журнала, которые содержат вышеуказанные данные, будут вставлены в таблицу в режиме реального времени, и мой клиентский код должен запрашивать эти записи и анализировать их.Проблема, с которой я сталкиваюсь сейчас - это чтение уникальной записи каждого запроса.В настоящее время у меня есть эта функция:

/* Called every 1000 ms (1 second). */
gboolean app_models_timed_query(gpointer data) {
    FwApp *app = data;

    char query[APP_MAXIMUM_STRING_CHARS];

    strncpy(query, "SELECT * FROM ", APP_MAXIMUM_STRING_CHARS);
    strncat(query, app->query_db_table_name, APP_MAXIMUM_STRING_CHARS);
    strncat(query, " WHERE Timestamp <> @lastSeenTimestamp AND Symbol_name <> @lastSeenSymbolName AND Status <> @lastSeenStatus;", APP_MAXIMUM_STRING_CHARS);

    if (mysql_query(app->query_db_con, query))
    {
        printf("Unable to retrieve data from query table.\n");
        return TRUE;
    }

    MYSQL_RES *result = mysql_store_result(app->query_db_con);

    if (result == NULL) return TRUE;

    /* Analyze the resulting row(s) here. */

    /* How to set @lastSeenTimestamp, @lastSeenSymbolName and @lastSeenStatus here? */

    return TRUE;
}

Функция вызывается каждую секунду, и в ней я запрашиваю базу данных, используя следующую инструкцию:

SELECT * FROM table1 WHERE Timestamp <> @lastSeenTimestamp AND Symbol_name <> @lastSeenSymbolName AND Status <> @lastSeenStatus;

Никаких двух записей никогда не будетбыть точно такими же, но они могут иметь одинаковую метку времени, статус или имя символа.

Обратите внимание, что перед тем, как разрешить вызов app_models_timed_query каждую секунду, я устанавливаю пользовательские переменные следующим образом:

SET @lastSeenTimestamp = -1, @lastSeenSymbolName = '', @lastSeenStatus = 0;

И поскольку метки времени никогда не будут отрицательными, при первом вызове app_models_timed_query первая строка будет в результате запроса.

Однако мой вопрос заключается в том, какустановить пользовательские переменные в последнюю строку результата моего запроса.Кроме того, я хочу знать, есть ли лучший способ чтения только недавно вставленных строк при каждом вызове app_models_timed_query.

Большое спасибо, Vikas

1 Ответ

0 голосов
/ 22 ноября 2018

Вы должны использовать очередь сообщений, такую ​​как RabbitMQ, для такого рода приложений.Очереди сообщений имеют API, связанный с извлечением из верхней части очереди.Даже если вы храните основные данные в MySQL, вы можете использовать очередь сообщений для первичного ключа.При таком выборе подходящей инфраструктуры ваше приложение не должно сохранять состояние.

...