0

私はsqlite3を試しています。マルチスレッドアプリケーションで使用して、スレッド間で共有されるデータのすべてのロックとアトミック性に取り組むつもりです。スピードを維持するために、またプログラムの実行間でデータを保存する必要がないため、ほとんどの場合100行未満、最悪の場合500行未満のインメモリデータベースを使用しようとしています。

私はlibsqlite3バージョン3.7.9-2ubuntu1.1を搭載したUbuntu12.04x64で実行しています。

これが私のコードです:

#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行については、たくさんのバリエーションを試しましたが、2つの問題があります。これらのバリエーションを試してみると、皮肉なことに「絶対に起こらない」とコメントしたセクションで「メモリ不足」エラーが発生します。

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_READWRITESQLITE_OPEN_CREATEフラグが必要です。

SQLITE_OPEN_URIURIファイル名を有効にするにはフラグが必要です。

于 2012-09-17T17:56:50.263 に答える
0

SQLite3をIPCメカニズムとして使用することは実用的ではありません。ソケットを作成し、ループバックインターフェイスを使用してスレッド間で通信する方が実用的と思われます。また、Windowsプラットフォームで配布する必要がない場合は、D-busを確認してください。

スレッド間で情報を共有するためにデータベースを使用することもありません。データベースは大量のデータを格納するために使用されます。おそらく、シリアル化を検討する必要があります。

protobufは、CまたはC++でシリアル化するための優れたライブラリです。

于 2012-09-17T16:32:04.277 に答える