首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite:带附加数据库的预写日志记录(WAL日志模式)

SQLite:带附加数据库的预写日志记录(WAL日志模式)
EN

Stack Overflow用户
提问于 2016-08-25 15:21:16
回答 1查看 3.1K关注 0票数 1

在数据库优化方面,我们将数据库分成两个数据库: db和db2。一个低优先级的后台线程正在插入到db2中。db上的一些查询是与db2连接的,因此我们需要将db2附加到db。我们启用WAL是因为希望所有这些都是多线程的。

代码语言:javascript
复制
SQLiteDatabase db = SQLiteDatabase.openDatabase(dbPath, ...);
db.enableWriteAheadLogging();
db.execSQL("attach " + db2path + " as db2");

为了理解这个问题,我们运行了一个简单的两个线程测试。第一个线程将行插入到db中,第二个线程从db中进行选择。每个线程从前一个循环中打印时间增量和我们在数据库中的时间。

代码语言:javascript
复制
thread 1 loop:                             | thread 2 loop:
    t1 = getTime()                         |   t1 = getTime()
    db2.execSQL("insert into ....");       |   db2.execSQL("select ....");
    t2 = t3                                |   t2 = t3
    t3 = getTime()                         |   t3 = getTime()
    log("i: "+(t3-t1)+", delta: "+(t2-t1)) |   log("s: "+(t3-t1)+", delta: "+(t2-t1))

我们看到的是选择线程阻塞了插入线程。这可以通过做一个巨大的(缓慢的)选择和一个微小的插入来强调。您将看到插入时间和增量大约增加到选择的时间。如果我们不运行慢线程,插入线程将大大加快速度。

深入研究SQLiteDatabase的源代码,我在SQLiteDatabase#enableWriteAheadLogging()中找到了以下行

代码语言:javascript
复制
// make sure this database has NO attached databases because sqlite's write-ahead-logging
// doesn't work for databases with attached databases
if (mHasAttachedDbsLocked) {
    if (Log.isLoggable(TAG, Log.DEBUG)) {
        Log.d(TAG, "this database: " + mConfigurationLocked.label
                + " has attached databases. can't  enable WAL.");
    }
    return false;
}

现在来回答我的问题:

  1. 这句话的意思是什么?什么东西不起作用?是遗留下来的旧代码吗?附加数据库(attach.html)的文档显式地表明附加+ WAL是OK的(有一个小的警告)。
  2. 为什么Android绑定代码试图保护我们免受SQLite内部问题的影响?在我看来,它应该是一个薄的界面层。

编辑:我将此报告为AOSP问题跟踪器中的一个bug。如果有答案出现,将更新。

EN

回答 1

Stack Overflow用户

发布于 2016-08-25 17:59:00

WAL允许读者和作家同时,但只能来自不同的联系。您不应该使用来自多个线程的相同连接( SQLiteDatabase对象)。

WAL设置是永久性的;您不需要每次打开数据库后都执行它。

  1. 这句话的意思正是它所说的。(没有人保证这个评论是正确的。)
  2. 有时候,Android框架试图变得聪明。但是您可以手动执行PRAGMA journal_mode = WAL
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39149065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档