0

我正在尝试使用 sqlite3。我打算在多线程应用程序中使用它来解决线程之间共享数据的所有锁定和原子性。为了保持速度并且因为我不需要在程序运行之间保存的数据,我正在尝试使用一个内存数据库,该数据库大部分时间包含 < 100 行,最坏的情况是 < 500 行。

我在带有 libsqlite3 版本 3.7.9-2ubuntu1.1 的 Ubuntu 12.04 x64 上运行。

这是我的代码:

#include <stdio.h>
#include <sqlite3.h>

int main(int argc, char *argv[]) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;

    rc = sqlite3_open_v2("file::memory:?cache=shared", &db, SQLITE_OPEN_FULLMUTEX, NULL);

    /* This should never ever happen! */
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return(1);
    }

    rc = sqlite3_exec(db, "CREATE TABLE Players (id int, ip varchar(15), x int, y int);", NULL, NULL, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }

    sqlite3_close(db);
    return 0;
}

对于 sqlite3_open 行,我尝试了很多变化,但有两个问题。当我尝试这些变体时,在我讽刺地评论为“不应该发生”的部分中出现“内存不足”错误:

rc = sqlite3_open_v2("file::memory:?cache=shared", &db, SQLITE_OPEN_FULLMUTEX, NULL);
rc = sqlite3_open_v2(":memory:", &db, SQLITE_OPEN_FULLMUTEX, NULL);

当我尝试这个更简单的行时,它通过在磁盘上创建一个名为“file::memory:?cache=shared”的文件来违反文档:

rc = sqlite3_open("file::memory:?cache=shared", &db);

我到底在这里做错了什么?

4

2 回答 2

1

您可能需要SQLITE_OPEN_READWRITEandSQLITE_OPEN_CREATE标志。

您需要该SQLITE_OPEN_URI标志来启用 URI 文件名。

于 2012-09-17T17:56:50.263 回答
0

使用 SQLite3 作为 IPC 机制听起来不切实际。创建一个套接字并使用您的环回接口在线程之间进行通信似乎更实用。此外,如果您不需要在 Windows 平台上分发,请查看 D-bus。

我也不会使用数据库在线程之间共享信息。数据库用于存储大量数据,也许您应该考虑序列化。

protobuf是一个很好的 C 或 C++ 序列化库。

于 2012-09-17T16:32:04.277 回答