我正在用 C 语言做一个函数库,它提供了读取、写入和清理 sqlite3 数据库表的寄存器的基本函数。
当我使用一个终端执行它时,所有功能都可以正常工作。但是,我的问题是当我尝试使用多个终端的功能时。例如,在一个终端中,我有一个程序,该程序使用一个将信息存储在数据库文件表中的函数。另一方面,在另一个终端中,我有一个程序,它使用不同的函数将信息存储在同一数据库的另一个表中。然后,在这种环境中,信息无法正确存储。所以,我认为我必须使用信号量或互斥体机制来实现所有功能。
在 sqlite3 文档中搜索,我发现有提供互斥机制的函数。这些功能如下:
- sqlite3_mutex *sqlite3_db_mutex(sqlite3*); => 返回数据库连接的指针互斥锁
- 无效 sqlite3_mutex_enter(sqlite3_mutex*); => 进入临界区
- 无效 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互斥函数很好用,必须正常运行,还是我的代码中的这些实现是错误的?
· 有没有另一种机制来实现多进程并发的读写数据库?这些机制是哪些以及如何实施?
几天前我一直遇到这个问题,但我没有找到解决办法。
非常感谢!