SQLiteDatabase.EnableWriteAheadLogging 方法

定义

预写日志记录允许从同一数据库上的多个线程并行执行查询,并减少在文件系统同步上停止的可能性。

[Android.Runtime.Register("enableWriteAheadLogging", "()Z", "GetEnableWriteAheadLoggingHandler")]
public virtual bool EnableWriteAheadLogging();
[<Android.Runtime.Register("enableWriteAheadLogging", "()Z", "GetEnableWriteAheadLoggingHandler")>]
abstract member EnableWriteAheadLogging : unit -> bool
override this.EnableWriteAheadLogging : unit -> bool

返回

如果启用了预写日志记录,则为 True。

属性

例外

如果在调用此方法时正在进行事务,则为 。 只有在没有正在进行的事务时,WAL 模式才能更改。

注解

预写日志记录允许从同一数据库上的多个线程并行执行查询,并减少在文件系统同步上停止的可能性。 在大多数情况下,预写日志记录的速度更快。

<h3>优点和最佳做法</h3>

默认情况下未启用预写日志记录。 但是,通常建议应用启用预写日志记录,除非应用使用与预写日志记录不兼容的 SQLite 功能。

启用预写日志记录后,写入操作将出现在单独的日志文件中,这样其他线程中的读取就可以同时继续。 当写入正在进行时,其他线程上的读取器将感知数据库的状态,就像在写入开始之前一样。 写入完成后,其他线程上的读取器将感知数据库的新状态。

预写日志记录的另一个好处是,它减少了对基础文件系统的 fsync 调用数。 调用 fsync 可能会阻止系统锁,在文件系统缓慢的设备上,尾部延迟较差。

启用预写日志记录的最有效方法是将 #ENABLE_WRITE_AHEAD_LOGGING 标志 #openDatabase传递给 。 这比调用 #enableWriteAheadLogging更有效。 <pre> SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING, myDatabaseErrorHandler); </pre> <h3>禁用预写日志记录</h3>

如果数据库具有任何附加的数据库,则不可能并行执行查询。 同样,只读数据库或内存数据库不支持预写日志记录。 在这种情况下, #enableWriteAheadLogging() 返回 false。

如果未启用预写日志记录(默认日志记录或调用 #disableWriteAheadLogging后),则无法同时对数据库进行读取和写入。 在修改数据库之前,编写器会隐式获取数据库的排他锁,从而阻止读取器访问数据库,直到写入完成。

预写日志记录会稍微增加 SQLite 的内存使用量。 可以使用 meminfo 等工具衡量对内存的影响。

<h3>用法</h3>

使用 #ENABLE_WRITE_AHEAD_LOGGING 标志或调用此方法打开数据库后,只要数据库保持打开状态,就启用并行执行查询。 若要并行禁用查询的执行,请调用 #disableWriteAheadLogging 或关闭数据库并重新打开它。

通过打开与数据库的多个连接,并为每个查询使用不同的数据库连接来执行查询的并行执行。 数据库日记模式也会更改,以启用写入以并发进行读取。 用于并行执行查询的最大连接数取决于设备内存和其他属性。

如果查询是事务的一部分,则会在启动事务的同一数据库句柄上执行该查询。

编写器应使用 #beginTransactionNonExclusive()#beginTransactionWithListenerNonExclusive(SQLiteTransactionListener) 启动事务。 非独占模式允许执行查询的其他线程读取数据库文件。

如果数据库具有任何附加的数据库,则不可能并行执行查询。 同样,只读数据库或内存数据库不支持预写日志记录。 在这种情况下, #enableWriteAheadLogging 返回 false。

另请参阅 SQLite Write-Ahead 日志记录 ,详细了解预写日志记录的工作原理。

Java文档android.database.sqlite.SQLiteDatabase.enableWriteAheadLogging()

本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。

适用于

另请参阅