具有多个进程的SQLite3性能测试

时间:2012-08-21 01:27:38

标签: c++ dll sqlite stress-testing

我写了一个使用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试图一次写入同一个DB?或者我只是在我的负载测试中过于努力地推送sqlite?我是否需要编写自己的连接池?

对此事的任何帮助都会很棒。感谢。

2 个答案:

答案 0 :(得分:2)

如果你关心你得到的发行版,那么你需要编写代码,这些代码不会增加十亿分之一而不添加任何b。您编写的代码不符合您的要求。这不是sqlite的错。如果你不想写1000个而不是b,那么就不要这样做。

您可以保证的是,数据库将取得进展。这取决于你的代码,不要让db做你绝对不希望它做的事情。

Sqlite正在尽可能快地取得前进的进展。这是它的工作,99.99%的时间,这是每个人都想要的。进程切换很昂贵,因此sqlite正在最小化它。这是你的工作,不要求它做你不希望它做的事情。编写代码,以便只要求数据库执行您想要它要执行的操作。然后,当数据库以尽可能快的速度运行时,您将得到您想要的结果。

答案 1 :(得分:0)

我想我在这里指定的文档中找到了解决方案:

http://www.sqlite.org/faq.html#q5

如果有人有任何需要添加或遇到相同问题,我会保留此问题:)