当前位置:  开发笔记 > 编程语言 > 正文

SQLite多进程访问

如何解决《SQLite多进程访问》经验,为你挑选了1个好方法。

我们在多进程和多线程应用程序中使用SQLite.SQLite数据库文件使用嵌入式SQLite加密进行加密.的常见问题是SQLite的应该能够管理多进程状态存取使用锁机制.我们遇到了一个奇怪的问题:当许多线程访问同一个数据库文件时,有时会发生约束违规,更具体地说 - 具有唯一约束的字段在调用"insert或replace"语句后获得重复值.它现在经常发生,我们正在使用加密.在我们开始使用SQLite加密之前,我们没有注意到这种行为.这有什么具体的已知问题吗?



1> Kiril..:

虽然SQLite是"线程安全的",但您仍然无法同时修改数据库:

然后每个线程继续插入一些记录,假设为1000.您将遇到的问题如下:一个线程将通过设置对文件的锁定来控制数据库.这很好,但是当锁定处于活动状态时,其余的线程将继续对每个尝试的INSERT失败.(参考)

一次只允许一个线程修改数据库,但是您可以拥有多个尝试修改数据库的线程.

如果要避免失败时锁定问题,可以检查SQLITE_BUSY标志:

测试SQLITE_BUSY,我最初没有这样做.这里有一些伪代码来说明解决方案:

  while (continueTrying) {
    retval = sqlite_exec(db, sqlQuery, callback, 0, &msg);
    switch (retval) {
      case SQLITE_BUSY:
        Log("[%s] SQLITE_BUSY: sleeping fow a while...", threadName);
        sleep a bit... (use something like sleep(), for example)
        break;
      case SQLITE_OK:
        continueTrying = NO; // We're done
        break;
      default:
        Log("[%s] Can't execute \"%s\": %s\n", threadName, sqlQuery, msg);
        continueTrying = NO;
        break;
    }
  }

  return retval;

相同的参考

我敢打赌,你的约束违规与多线程无关,所以请你发布你得到的实际约束违规(或者一个符合www.sscce.org的例子).

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有