我的 Sqlite 数据库是从我的代码中的各个线程访问的,因此我遇到了很多数据库锁定问题。
为了克服锁定问题,我只在主线程中查询数据库。这样做的缺点是如果有很多查询要执行,我的主线程很忙。
我想编写一种机制,其中所有数据库调用都从一个地方(在辅助线程中)执行,以便它可以同步并且调用者可以从任何线程调用。
如果任何模块想要执行查询,它可能会从主 DB Sync 类检查 DB 是忙还是空闲来执行任务。
备注 :- 在我当前的实现中,每次我想执行查询时我都会打开和关闭数据库。它会对性能产生任何影响吗?
任何正确方向的提示将不胜感激。
最佳答案
重新打开数据库当然比保持打开需要更多的时间。但是,这可能不是一个明显的时间量。
我建议你创建一个 Grand Central Dispatch queue并将其用于所有数据库访问。以下是创建它的方法:
// The queue needs to be a global variable, or globally accessible in some way.
dispatch_queue_t dbQueue;
// Make your sqlite3 connection global too.
sqlite3 *dbConnection;
// In your application delegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// usual initialization ...
...
int rc = sqlite3_open(dbFilename, &dbConnection);
if (rc != SQLITE_OK)
handleDbError(rc, dbConnection);
dbQueue = dispatch_queue_create("dbQueue", DISPATCH_QUEUE_SERIAL);
...
}
以下是你如何使用它:
dispatch_queue_async(dbQueue, ^{
// This block runs off the main thread, and does not run simultaneously
// with any other blocks submitted to `dbQueue`.
NSString *result = executeDatabaseQuery();
dispatch_queue_async(dispatch_get_main_queue(), ^{
// This block runs on the main thread.
[(MyAppDelegate *)[UIApplication delegate] presentResult:result];
});
});
关于iphone - iOS中的sqlite锁定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8163267/