【发布时间】:2020-04-08 15:26:45
【问题描述】:
我在以只读方式访问 sqlite3 数据库时遇到了一些问题。 在系统(Linux 嵌入式)上,有一个 C++ 应用程序打开(并保持打开)到数据库的 r/w 连接。此应用程序几乎连续地进行读写。
然后有一个 PHP Web 应用程序,它每 1 秒打开一个只读连接以获取数据。 好像一点问题都没有。
最后有一个 C 应用程序应该打开另一个到同一个数据库的只读连接并每隔几秒获取数据。此应用程序经常遇到busy error。
据我从帮助和有关此主题的其他问题中了解到,这通常在您尝试编写并且有另一个正在运行的写入事务时触发。 帮助还说“或在某些情况下阅读”,但我无法弄清楚这些情况。
可能会在 C++ 应用程序仍在写入时尝试读取,但据我所知,这不会导致此错误。读取查询将返回“旧”值,但应该没有问题地完成。
正确吗?
这里是返回此错误的 C 代码:
sqlite3 *db;
sqlite3_stmt *stmt;
char *qry=0;
int rc,value=0;
sqlite3_open_v2( "<mydb>", &db,SQLITE_OPEN_READONLY,NULL);
if (db == NULL)
{
syslog(LOG_INFO,"Failed to open db\n");
return -1;
}
qry=malloc(80);
if (qry) {
sprintf (qry,"select value from dataplc WHERE address=%d",addr);
rc = sqlite3_prepare_v2(db, qry,-1,&stmt,NULL);
if (rc != SQLITE_OK) {
syslog(LOG_INFO, "Failed to read: %d - rc: %d", addr,rc); // -5 -> db busy
value = -1;
} else {
rc = sqlite3_step(stmt);
if (rc == SQLITE_ROW) {
value = sqlite3_column_int(stmt, 0);
// do something
}
}
free (qry);
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return value;
代码或整个方法是否有明显错误?
【问题讨论】:
-
您应该检查
sqlite3_open_v2()的返回值是否成功。即使它失败了,它也会分配一个必须用sqlite3_close()释放的sqlite3结构,因此测试该指针以查看它是否为空是行不通的。 -
还可以查看
sqlite3_busy_timeout()函数。如果你还没有使用 WAL 模式。 -
@Shawn,关于
sqlite3_busy_timeout()我不确定它是否仅适用于写入。