我正在使用一个围绕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,似乎不需要重试逻辑,因为它从未达到忙碌或锁定状态。
我宁愿做的是修复从多个线程访问单个数据库连接的问题,但我不能在我的生活中找到它发生的位置。
因此,如果任何人有任何关于定位多线程错误的提示,我将非常感激。
提前致谢。
答案 0 :(得分:1)
我没有对此进行测试以查看它是否有效,但是你可以尝试在函数中包装对db连接的访问,然后使用Instruments记录对该函数的访问,IIRC应该让你获得一个线程ID和堆栈跟踪。这应该会让你对它的来源有所了解。或者你可以在它上面设置一个断点,但这可能需要更长的时间。