【问题标题】:SQLite3 performance testing with multiple processesSQLite3 多进程性能测试
【发布时间】: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


【解决方案1】:

如果你关心你得到什么样的分布,那么你需要编写不会添加十亿个 a 而不添加任何 b 的代码。您正在编写不符合您要求的代码。这不是 sqlite 的错。如果你不想写 1000 个 a 而没有 b,那就不要那样做。

您只能保证数据库将取得进展。由您的代码决定是否要求数据库执行您绝对不希望它执行的操作。

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

【讨论】:

  • 完美,这正是我需要知道的。我需要衡量我的 .dll 需要承担多少责任 :) - sqlite3 给我留下了深刻的印象 - 感谢您的回答。
【解决方案2】:

我想我已经在此处指定的文档中找到了解决方案:

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

如果有人要添加任何内容或遇到同样的问题,我会保留这个问题:)

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 2021-09-21
    • 2010-11-06
    • 1970-01-01
    • 2023-04-04
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多