我写了一个使用 sqlite3 的 .dll。它有一个插入功能,可以在数据库上执行插入操作。
我还有一个使用 dll 执行插入的测试可执行文件。现在我正在测试 sqlite 及其管理多个连接的能力。测试程序插入无限循环,伪代码如下:
while(1) {
openDb();
doInsert();
closeDb();
}
基本上,我已将其设置为运行我的测试应用程序的 4 个版本,并且每个版本都将一个字母(a、b、c 或 d)插入到数据库中。
目前,这不起作用,因为数据库几乎总是处于锁定状态。它适用于一两个程序,但如果我运行所有 4 个程序,它就不会像我创建一个大的竞争条件一样。
我查看了文档,并且遇到了此处指定的 SQLITE_OPEN_FULLMUTEX 之类的内容:http://www.sqlite.org/c3ref/open.html
sqlite3 是否提供了一种机制来处理多个 exe 试图同时写入同一个数据库?或者我只是在我的负载测试中过度使用 sqlite?我需要编写自己的连接池吗?
在这件事上的任何帮助都会很棒。谢谢。
最佳答案
如果您关心获得的分布,那么您需要编写不会在不添加任何 b 的情况下添加十亿个 a 的代码。您正在编写不符合您要求的代码。那不是sqlite的错。如果您不想写 1,000 个 a 而没有 b,那就不要那样做。
您可以保证数据库会取得进展。是否要求数据库执行您绝对不希望它执行的操作取决于您的代码。
Sqlite 正在以尽可能快的速度取得尽可能多的进步。这就是它的工作,而且在 99.99% 的时间里,这就是每个人都想要的。进程切换是昂贵的,所以 sqlite 正在最小化它。 你的工作就是不要求它做你不希望它做的事情。编写您的代码,以便仅要求数据库执行您希望它执行的操作。然后,当数据库尽可能快地运行时,您就会得到想要的东西。
关于c++ - SQLite3 多进程性能测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12047343/