1

データをマップに読み取り、sqlite データベースに書き込むアプリケーションがあります。アプリケーションは他にも多くのことを行い、db 部分への書き込みを除いて非同期 (boost asio を使用) です。サンプルの疑似コードは次のとおりです。

struct records;
std::map<int, records> list;
void read() {
    // Dump(read) X records into list
    // If record id doesn't exist, add it. dirty = true
    // If it exists, update all other fields. dirty = true if any fields changed.
}

void writeDB() {
    sqlite3_prepare_v2();
    for(const auto& record : list) { // iterate map
        if(!record.dirty())
            continue;
        sqlite3_bind(); // bind record fields
        sqlite3_step(); // execute sql 
        sqlite3_reset(); // reset
    }
    sqlite3_finalize();
}

main() {
    while(1) {
        read();
        writeDB();
    }
}

私の最初の計画は、データベース内の各レコードを並行して書き込む for ループ内に新しいスレッドを生成することでした。2 つの問題があります。

1) db ロックを実装する必要がある場合があります。

2) sqlitebind(), step() and reset()は同じステートメントで動作します。したがって、レコードは順番に書き込まれる必要があります。

C++ 17 を使用しています。データベース呼び出しを非同期にすることに関する提案はありますか? 助けてくれてありがとう!

4

1 に答える 1