SQLiteOpenHelper 单连接与多连接

Mus*_*eed 5 sqlite multithreading android sqliteopenhelper android-sqlite

我对访问SQLiteDatabase. 它应该是一个连接或多个连接才能从多个线程访问。我已经阅读了很多文章,包括以下两篇。

/sf/answers/258291841/ http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking

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

/sf/answers/2475109171/

但是在阅读了enableWriteAheadLogging哪些州的文档后我仍然感到困惑

此方法支持从同一数据库上的多个线程并行执行查询。它通过打开到数据库的多个连接并为每个查询使用不同的数据库连接来实现这一点。数据库日志模式也更改为允许写入与读取同时进行。

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

请说清楚。

Ahm*_*azy 2

无论在处理线程时是否使用单例实例,enableWriteAheadLogging大多数应用程序都是这种情况,除非它是一个非常简单的应用程序(例如示例)。

使用单例实例可确保线程安全:单例实例可确保跨该实例进行同步,这意味着当您有一个从不同线程同时调用数据库的读写方法时,其中一个方法应该等待另一个方法,如数据库在写入时被锁定。

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

数据库上的读取和写入不可能同时发生。在修改数据库之前,写入者会隐式获取数据库上的排他锁,以防止读取者在写入完成之前访问数据库。

enableWriteAheadLogging实际上改变了上述行为,因为上述语句仅在未启用预写日志记录(默认)时才为真。

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

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

相反,当启用预写日志记录(通过调用此方法)时,写入操作发生在单独的日志文件中,该文件允许同时进行读取。当写入正在进行时,其他线程上的读取器将感知数据库的状态,就像写入开始之前一样。当写入完成时,其他线程上的读取器将感知数据库的新状态。

每当多个线程同时访问和修改数据库时,启用预写日志记录是一个好主意。然而,预写日志记录比普通日志记录使用更多的内存,因为同一个数据库有多个连接。因此,如果数据库仅由单个线程使用,或者优化并发性不是很重要,则应禁用预写日志记录。