【发布时间】:2012-08-21 09:47:28
【问题描述】:
我编写了一个使用 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?我需要自己写连接池吗?
在这件事上的任何帮助都会很棒。谢谢。
【问题讨论】:
-
真正的问题是什么?你说“它不运行”,但大概它仍在向数据库中添加条目——这就是它应该做的一切。那么真正的问题是什么?即使您收到
SQLITE_BUSY,数据库仍在尽可能快地取得进展。如果您不满意您的代码正在执行您编写的代码,请更改它! -
不,问题是我没有得到你所期望的 a、b、c 和 d 的分布。如果在插入后释放锁,您会希望在数据库中看到大致相等数量的每个字母,问题是我插入了 0 个条目。我已经阅读了下面的链接,我想我已经弄清楚了。我只是对sqlite的要求有点过分,现在我只是在遇到锁后睡几秒钟,然后再试一次。
标签: c++ dll sqlite stress-testing