0

尝试优化我的应用程序数据库工作。

在数据库同步期间,我的应用程序在一个事务中运行一大包“删除”和“插入”命令。在事务“COMMIT”应用程序运行“VACUUM”命令之后。VACUUM 工作正常,但有时需要很多时间。所以我决定在并行线程中移动'VACUUM'执行。这里出了点问题。在其他线程中,我得到“数据库已锁定”。

我所做的:

1.COMMIT成功后关闭数据库。

2.使用“VACUUM”再次启动单独的打开和关闭数据库的方法。

在“COMMIT”的同一线程中,“VACUUM”工作正常,但在单独的线程中,相同的方法会出现“数据库已锁定”错误。我可以肯定地说,没有其他进程适用于封闭数据库,因为数据库同步是一个逻辑上独立的应用程序进程。

我做错了什么?

    [connection closeDb];
    [connection release];

    if(!rollBackTransaction && commitSuccess){
// The commented code block doesn't work - "database is locked" error
//        NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(runVacuumForDataBase:) object:_dbFileName];
//        [thread start];
        [self runVacuumForDataBase:_dbFileName]; // <-- This works fine
    }
4

1 回答 1

0

您只能从一个线程同时访问 SQLite 数据库。在您的情况下,在不同的线程上执行 VACUUM 将不起作用,您必须等到第一个事务完成。祝你好运!

编辑在使用多线程环境时,我遇到了与您相同的问题。我最终为 SQLite db 使用了调度队列,其中所有到 db 的事务都是同步运行的。我强烈建议您将所有请求移动到数据库到不同的线程(辅助线程,而不是主线程)。

于 2013-10-17T11:17:28.437 回答