1

我正在用 C 语言做一个函数库,它提供了读取、写入和清理 sqlite3 数据库表的寄存器的基本函数。

当我使用一个终端执行它时,所有功能都可以正常工作。但是,我的问题是当我尝试使用多个终端的功能时。例如,在一个终端中,我有一个程序,该程序使用一个将信息存储在数据库文件表中的函数。另一方面,在另一个终端中,我有一个程序,它使用不同的函数将信息存储在同一数据库的另一个表中。然后,在这种环境中,信息无法正确存储。所以,我认为我必须使用信号量或互斥体机制来实现所有功能。

在 sqlite3 文档中搜索,我发现有提供互斥机制的函数。这些功能如下:

  1. sqlite3_mutex *sqlite3_db_mutex(sqlite3*); => 返回数据库连接的指针互斥锁
  2. 无效 sqlite3_mutex_enter(sqlite3_mutex*); => 进入临界区
  3. 无效 sqlite3_mutex_leave(sqlite3_mutex*); => 离开临界区

我已经用我的函数尝试过,但结果是一样的,当我尝试用不同的进程存储信息(写入同一个数据库)时,信息无法正确存储。我为存储信息的两个函数实现的代码更简单,如下所示:

第一个函数 => 将数据存储在 table1 中。

  int add_register_table1(unsigned short int type,unsigned short int err, const char *msg, const char *agent)
{
    //Local variables:
    int rc, t0;
    char buffer[BUFFER_SIZE];
    char *errMsg = 0;
    sqlite3 *db;
    sqlite3_mutex* mutex;

    //Initializing variables:
    t0 = (int) time(NULL);  //Save the current time in seconds

    //Opening the syslog.db database connection:
    rc = sqlite3_open(database.db, &db);

    if(rc != SQLITE_OK)     //Error checking
        return ERROR;

    mutex = sqlite3_db_mutex(db);   //Acquire the mutex

    //Writing data:
    sqlite3_mutex_enter(mutex);   //Enter critical zone
    sprintf (buffer,"INSERT INTO table1 VALUES ('%d','%d','%d','%s','%s');", t0, type, err, 
                                                                                         msg, agent);
    rc = sqlite3_exec(db, buffer, NULL, NULL, &errMsg);

    sqlite3_mutex_leave(mutex);   //Leave critical zone

    if(rc != SQLITE_OK)     //Error checking
        return ERROR;

    //Closing the database connection:
    sqlite3_close(db);

    return NOERROR;
}

第二个功能相同,但它将信息存储在同一数据库文件的另一个表中:

int add_register_table2(unsigned short int type,unsigned short int err, const char *msg, const char *agent)
{
    //Local variables:
    int rc, t0;
    char buffer[BUFFER_SIZE];
    char *errMsg = 0;
    sqlite3 *db;
    sqlite3_mutex* mutex;

    //Initializing variables:
    t0 = (int) time(NULL);  //Save the current time in seconds

    //Opening the syslog.db database connection:
    rc = sqlite3_open(database.db, &db);

    if(rc != SQLITE_OK)     //Error checking
        return ERROR;

    mutex = sqlite3_db_mutex(db);   //Acquire the mutex

    //Writing data:
    sqlite3_mutex_enter(mutex);   //Enter critical zone
    sprintf (buffer,"INSERT INTO table2 VALUES ('%d','%d','%d','%s','%s');", t0, type, err, 
                                                                                         msg, agent);
    rc = sqlite3_exec(db, buffer, NULL, NULL, &errMsg);

    sqlite3_mutex_leave(mutex);   //Leave critical zone

    if(rc != SQLITE_OK)     //Error checking
        return ERROR;

    //Closing the database connection:
    sqlite3_close(db);

    return NOERROR;
}

我的问题如下:

· 查看我的C代码,使用的sqlite3互斥函数很好用,必须正常运行,还是我的代码中的这些实现是错误的?

· 有没有另一种机制来实现多进程并发的读写数据库?这些机制是哪些以及如何实施?

几天前我一直遇到这个问题,但我没有找到解决办法。

非常感谢!

4

0 回答 0