如何在定时函数中从客户端代码实时接收 MySQL 数据库中的任何更改?
How to receive any changes in MySQL database in real time from client code in a timed function?
我有一个带有日志记录 table 的数据库,如下所示:
+-----------+------------------------+--------+
| Timestamp | Symbol_name | Status |
+-----------+------------------------+--------+
| 1 | Group2 | 1 |
| 2 | Group1-Device3-Signal1 | 1 |
| 3 | Group2-Device1-Signa13 | 0 |
+-----------+------------------------+--------+
其中 Timestamp
是 double
,Symbol_name
是 varchar
,Status
是 int
。
包含上述数据的日志记录将被实时插入table,我的客户端代码应该查询这些记录并分析它们。我现在遇到的问题是每次查询都读取一个唯一的记录。目前,我有这个功能:
/* 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中,你也可以使用消息队列作为主键。通过选择合适的基础架构,您的应用程序不需要保留状态。
我有一个带有日志记录 table 的数据库,如下所示:
+-----------+------------------------+--------+
| Timestamp | Symbol_name | Status |
+-----------+------------------------+--------+
| 1 | Group2 | 1 |
| 2 | Group1-Device3-Signal1 | 1 |
| 3 | Group2-Device1-Signa13 | 0 |
+-----------+------------------------+--------+
其中 Timestamp
是 double
,Symbol_name
是 varchar
,Status
是 int
。
包含上述数据的日志记录将被实时插入table,我的客户端代码应该查询这些记录并分析它们。我现在遇到的问题是每次查询都读取一个唯一的记录。目前,我有这个功能:
/* 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中,你也可以使用消息队列作为主键。通过选择合适的基础架构,您的应用程序不需要保留状态。