0

我编写了一个使用 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?我需要编写自己的连接池吗?

在这个问题上的任何帮助都会很棒。谢谢。

4

2 回答 2

2

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

唯一可以保证的是数据库将取得进展。由您的代码决定不要要求数据库做您绝对不希望它做的事情。

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

于 2012-08-21T01:47:28.353 回答
0

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

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

如果有人要添加任何内容或遇到相同的问题,我将保留此问题:)

于 2012-08-21T01:39:55.477 回答