iPhone上的SQLite - 用于跟踪多线程相关错误的技术

时间:2009-09-29 09:39:08

标签: iphone multithreading sqlite

我正在使用一个围绕SQLite的Objective-C包装器,我没有写,而且文档很稀疏......

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

似乎代码遇到了从多个线程访问数据库连接的错误 - 如果使用SQLITE_THREADSAFE 2编译if SQLite,则根据SQLite文档将无效。

我测试了作为iPhone SDK一部分提供的libsqlite3.dylib,并看到它是以这种方式编译的,使用sqlite_threadsafe()例程。

使用提供的sqlite库,代码在执行例程时会定期点击SQLITE_BUSY和SQLITE_LOCKED返回码。

为了解决这个问题,我添加了一些代码来等待几毫秒并再次尝试,最大重试次数为50.此代码之前没有包含任何重试逻辑。

现在,当sqlite调用返回SQLITE_BUSY或SQLITE_LOCKED时,将调用重试循环并重试返回SQLITE_MISUSE。不好。

抓住吸管,我用自己编译的版本替换了提供的sqlite库,将SQLITE_THREADSAFE设置为1 - 根据文档的说法,sqlite可以安全地用于多线程环境,有效地序列化所有操作。它会导致性能损失,这是我没有测量过的,但它消除了应用程序发生的SQLITE_MISUSE,似乎不需要重试逻辑,因为它从未达到忙碌或锁定状态。

我宁愿做的是修复从多个线程访问单个数据库连接的问题,但我不能在我的生活中找到它发生的位置。

因此,如果任何人有任何关于定位多线程错误的提示,我将非常感激。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我没有对此进行测试以查看它是否有效,但是你可以尝试在函数中包装对db连接的访问​​,然后使用Instruments记录对该函数的访问,IIRC应该让你获得一个线程ID和堆栈跟踪。这应该会让你对它的来源有所了解。或者你可以在它上面设置一个断点,但这可能需要更长的时间。