Выполнять SQL-запросы асинхронно в C ++ - PullRequest
1 голос
/ 13 октября 2019

У меня есть приложение, которое считывает данные на карту и записывает их в базу данных sqlite. Приложение выполняет много других функций и является асинхронным (использует boost asio), за исключением записи в db part. Вот пример псевдокода:

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, который будет записывать каждую запись в базу данных параллельно. Есть две проблемы.

1) Может потребоваться реализация блокировки базы данных.

2) sqlite bind(), step() and reset() работает с тем же оператором. Итак, записи должны быть записаны последовательно.

Я использую C ++ 17. Есть предложения по асинхронным вызовам базы данных? Спасибо за помощь!

1 Ответ

1 голос
/ 13 октября 2019

Вам не нужно реализовывать блокировку. SQLite предоставляет гарантии ACID , что означает, что вам не нужно реализовывать блокировку вокруг ваших вставок.

При этом создание потока для каждой операции вставки - это, безусловно, излишнее. Вы можете разбить свой список на количество частей, равное количеству ядер на машине, и выполнить N параллельных циклов для вставки. Но все, что за этим, вероятно, излишне, на мой взгляд.

Но не принимайте мои слова как должное. Подумайте об использовании своего кода и сравнительном анализе как однопоточной версии, которую вы сейчас используете, так и любой параллельной реализации, которую вы можете выбрать. Вы можете тестировать на различное количество потоков (но имейте в виду, что существует связь между производительностью многопоточного кода и количеством доступных ядер), а также реализацией параллелизма: либо параллельное выполнение C ++ 17 std, либо варианты boost и т. Д. .

...