SQLiteOpenHelper单连接与多个连接

时间:2018-01-15 14:46:46

标签: android multithreading sqlite android-sqlite sqliteopenhelper

我对访问SQLiteDatabase非常困惑。它应该是一个连接或多个连接以从多个线程访问。我读了很多文章,包括以下两篇。

https://stackoverflow.com/a/3689883/3027124 http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking

这两个建议都有单一连接。 OP接受了我自己对同一问题的回答。我使用Singleton方法访问SQLiteopenHelper类。

https://stackoverflow.com/a/35358702/3027124

但是在阅读了enableWriteAheadLogging的文件

后,我仍然感到困惑
  

此方法可以并行执行多个查询   同一数据库上的线程。它是通过打开多个来实现的   连接到数据库并使用不同的数据库连接   对于每个查询。数据库日志模式也更改为启用   写入与读取同时进行。

现在这是令人困惑的部分。如果我想从同时多个线程访问数据库,我Singleton SQLiteOpenHelper访问enableWriteAheadLogging,在我的理解中,这意味着插入的串行执行,而同时读取可以无错误地完成。但是上面的文档说,为了实现同时访问,应该调用getWritableDatabase(),返回时会创建多个连接。这是怎么回事?如果我通过从多个线程使用Singleton SQLiteOpenHelper调用enableWriteAheadLogging来进行插入,这意味着什么?这些电话会串行吗?是否应该thread-count被召唤?

请澄清。

1 个答案:

答案 0 :(得分:2)

我会使用单例实例,无论我在处理线程时是否使用enableWriteAheadLogging,大多数应用都是如此,除非它是一个非常简单的应用程序,如样本。

使用单例实例确保线程安全:单例实例确保同步在该实例上工作,这意味着当您有一个读取和写入方法同时从不同线程调用数据库时,其中一个应该等待另一个,因为数据库在写入时被锁定。

很明显,这是文件中所写的情况,并在下面引用

  

不是   可以在数据库上同时进行读取和写入   时间。在修改数据库之前,编写者隐式地获取了一个   数据库上的独占锁定,阻止读者访问   数据库直到写完成。

enableWriteAheadLogging实际上正在改变上述行为,因为上述语句只有在未启用预写日志时(默认值)。

那么当您通过enableWriteAheadLogging启用预写日志记录时会发生什么?

它实际上改变了默认行为,实现了实际的并行性,因为它更改了底层数据库日志文件,以便能够同时执行写入和读取,但要做到这一点,它需要比平时更多的内存。阅读下面的文档报价以了解更多信息!

  

相反,当启用预写日志时(通过调用它)   方法),写操作发生在允许的单独日志文件中   读取同时进行。读者正在进行写作   在其他线程上将会感知数据库的状态   写作开始之前。当写完成时,读者就可以了   然后,线程将感知数据库的新状态。

     

在数据库中启用预写日志记录是个好主意   将由多个线程同时访问和修改   同时。但是,预写日志记录使用的内存要多得多   比普通的日记,因为有多个连接   相同的数据库因此,如果数据库仅由单个线程使用,   或者如果优化并发性不是很重要,那么就预先写入   应禁用日志记录。