mysql - 如何在定时函数中从客户端代码实时接收MySQL数据库中的任何更改?

标签 mysql c database real-time-data

我有一个带有日志记录表的数据库,如下所示:

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

其中 TimestampdoubleSymbol_namevarcharStatus > 是一个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 时仅读取新插入的行。

非常感谢, 维卡斯

最佳答案

对于此类应用程序,您应该使用像 RabbitMQ 这样的消息队列。消息队列有一个与从队列顶部获取相关的 API。即使你将主要数据存储在MySQL中,也可以使用消息队列作为主键。通过选择合适的基础设施,您的应用程序不需要保留状态。

关于mysql - 如何在定时函数中从客户端代码实时接收MySQL数据库中的任何更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53420450/

相关文章:

mysql varchar字节长度255问题

mysql - 保持连接 - mysql

mongodb - 如何知道mongodb使用的是哪个存储引擎?

database - CodeIgniter - 将输入数组写入数据库

mysql - 当我用幻灯片(在 Adob​​e Edge Animate 中制作)存档填充 MySQL 表时,我在 "type"中放入什么?

php - 无法将 PHP 更新发布到 MySQL

mysql - 使用 hibernate @Transactional 插入到表中

c - 函数 'sum' 的隐式声明在 C99 中无效

c - 使用 fopen 和 fscanf 将函数从 C 重写为汇编

c - "close"到其他变量在C中存储的规则是什么,如果有的话?