在 C++ 中异步执行 sql 查询
Execute sql queries asynchronously in C++
我有一个应用程序可以将数据读入地图并将它们写入 sqlite 数据库。该应用程序做了很多其他事情,并且是异步的(使用 boost asio),除了写入 db 部分。这是示例伪代码:
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。关于使数据库调用异步有什么建议吗?感谢您的帮助!
您不必实施锁定。 SQLite does provide ACID guarantees 这意味着您不必在插入内容周围实施锁定。
也就是说,为每个插入操作生成一个线程肯定是多余的。您可以考虑将您的列表拆分为与机器上的核心数相等的部分,并执行 N 个并行循环来插入。但在我看来,除此之外的任何事情都可能是矫枉过正。
但是不要把我的话当成理所当然。考虑检测您的代码并对您现在拥有的单线程版本以及您可能选择的任何并行实现进行基准测试。您可以测试各种线程数(但请记住,多线程代码性能与可用内核数之间存在关系)以及并发实现:C++17 std 并行执行或提升变体等.
我有一个应用程序可以将数据读入地图并将它们写入 sqlite 数据库。该应用程序做了很多其他事情,并且是异步的(使用 boost asio),除了写入 db 部分。这是示例伪代码:
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。关于使数据库调用异步有什么建议吗?感谢您的帮助!
您不必实施锁定。 SQLite does provide ACID guarantees 这意味着您不必在插入内容周围实施锁定。
也就是说,为每个插入操作生成一个线程肯定是多余的。您可以考虑将您的列表拆分为与机器上的核心数相等的部分,并执行 N 个并行循环来插入。但在我看来,除此之外的任何事情都可能是矫枉过正。
但是不要把我的话当成理所当然。考虑检测您的代码并对您现在拥有的单线程版本以及您可能选择的任何并行实现进行基准测试。您可以测试各种线程数(但请记住,多线程代码性能与可用内核数之间存在关系)以及并发实现:C++17 std 并行执行或提升变体等.