我对访问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
被召唤?
请澄清。
答案 0 :(得分:2)
我会使用单例实例,无论我在处理线程时是否使用enableWriteAheadLogging
,大多数应用都是如此,除非它是一个非常简单的应用程序,如样本。
使用单例实例确保线程安全:单例实例确保同步在该实例上工作,这意味着当您有一个读取和写入方法同时从不同线程调用数据库时,其中一个应该等待另一个,因为数据库在写入时被锁定。
很明显,这是文件中所写的情况,并在下面引用
不是 可以在数据库上同时进行读取和写入 时间。在修改数据库之前,编写者隐式地获取了一个 数据库上的独占锁定,阻止读者访问 数据库直到写完成。
enableWriteAheadLogging
实际上正在改变上述行为,因为上述语句只有在未启用预写日志时(默认值)。
那么当您通过enableWriteAheadLogging
启用预写日志记录时会发生什么?
它实际上改变了默认行为,实现了实际的并行性,因为它更改了底层数据库日志文件,以便能够同时执行写入和读取,但要做到这一点,它需要比平时更多的内存。阅读下面的文档报价以了解更多信息!
相反,当启用预写日志时(通过调用它) 方法),写操作发生在允许的单独日志文件中 读取同时进行。读者正在进行写作 在其他线程上将会感知数据库的状态 写作开始之前。当写完成时,读者就可以了 然后,线程将感知数据库的新状态。
在数据库中启用预写日志记录是个好主意 将由多个线程同时访问和修改 同时。但是,预写日志记录使用的内存要多得多 比普通的日记,因为有多个连接 相同的数据库因此,如果数据库仅由单个线程使用, 或者如果优化并发性不是很重要,那么就预先写入 应禁用日志记录。