代码之家  ›  专栏  ›  技术社区  ›  Jasarien

iPhone上的SQLite——追踪多线程相关错误的技术

  •  0
  • Jasarien  · 技术社区  · 16 年前

    我正在使用一个我没有编写的围绕SQLite的Objective-C包装器,文档很少。..

    这不是FMDB。编写此包装器的人在编写此代码时不知道FMDB。

    似乎代码遇到了一个错误,即从多个线程访问数据库连接——根据SQLite文档,如果SQLite是用SQLite_THREADSAFE 2编译的,那么这将不起作用。

    现在,当sqlite调用返回sqlite_BUSY或sqlite_LOCKED时,将调用重试循环,重试返回sqlite_MISUSE。不好的。

    抓住机会,我用自己编译的版本替换了提供的sqlite库,将sqlite_THREADSAFE设置为1——根据文档,这意味着sqlite可以在多线程环境中安全使用,有效地序列化了所有操作。它会导致性能下降,我还没有测量到这一点,但它消除了应用程序中发生的SQLITE_MISUSE,似乎不需要重试逻辑,因为它从未达到忙碌或锁定状态。

    因此,如果有人对查找多线程错误有任何建议,我将不胜感激。

    提前感谢。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Benno    16 年前

    我还没有测试它是否有效,但你可以尝试将对数据库连接的访问封装在一个函数中,然后使用Instruments记录对该函数的访问,IIRC应该可以让你获得线程ID和堆栈跟踪。这应该能让你对它的来源有一点了解。或者,您可以在其上设置一个断点,但这可能需要更长的时间。

    推荐文章