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 模式才能更改。

注解

此方法允许从同一数据库上的多个线程并行执行查询。 为此,请打开与数据库的多个连接,并为每个查询使用不同的数据库连接。 数据库日记模式也会更改,以启用写入以并发进行读取。

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

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

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

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

用于并行执行查询的最大连接数取决于设备内存和其他属性。

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

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

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

启用预写日志记录的最佳方式是将 #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>

启用预写日志记录的另一种方法是在打开数据库后调用 #enableWriteAheadLogging<pre> SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY, myDatabaseErrorHandler); db.enableWriteAheadLogging(); </pre>

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

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

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

适用于

另请参阅