SQLite:在WAL模式下保留文件句柄

时间:2012-04-26 11:13:22

标签: c++ multithreading sqlite

我有一个C ++程序,其中我有多个线程写入单个数据库的SQLite表(启用了WAL模式)。每个线程创建一个SQLite句柄,执行sqlite3_open(),写入表(在事务中写入),然后执行sqlite3_close(),然后删除SQLite句柄。然后线程就死了。

即使在所有线程都死掉之后,SQLite句柄仍然处于打开状态。为什么SQLite句柄没有关闭?我在这里缺少什么?

我的C ++程序在CentOS 5.5上运行。

[编辑] 这是我使用pthread

的示例程序
void threadFunction(void* pArg) {
    sqlite3 *handle;
    sqlite3_open("a.cm", &handle);    
    printf("Worker thread - Opened \n");
    sleep(10);    
    int r = sqlite3_close(handle);
    printf("Ret: %d\n", r);
    printf("Worker thread - Closed \n");
}

int main() {
    int i(0);
    pthread_t thread1, thread2;
    printf("Creating a worker thread\n");
    printf("SQLite libversion: %s\n", sqlite3_libversion());
    sqlite3 *handle;
    sqlite3_open("a.cm", &handle);    
    sqlite3_exec(handle, "pragma journal_mode = WAL", NULL, NULL, NULL);    
    printf("Main thread - Opened \n");

    pthread_create(&thread1, NULL, threadFunction, NULL);
    pthread_create(&thread2, NULL, threadFunction, NULL);

    pthread_join( thread1, NULL);
    pthread_join( thread2, NULL);
    sleep(200);
    sqlite3_close(handle);
    printf("Main thread - close \n");
    return 0;
}

1 个答案:

答案 0 :(得分:2)

联系SQLite团队:这是他们的回复 -

关闭一个连接时(在WAL模式下), SQLite检查进程中是否有任何其他连接 正在关闭的数据库文件上的POSIX锁定。如果是这样,那就推迟了 关闭文件句柄,直到另一个连接断开它 POSIX锁(如果还有另一个文件描述符将被重用 打开与同一文件的连接,但不然 等待它可以安全关闭)。

结论是: 所以直到从main()函数关闭连接 从其他线程打开的句柄不会被关闭!