SQLiteDatabase.EnableWriteAheadLogging Metode

Definisi

Pengelogan write-ahead memungkinkan eksekusi kueri paralel dari beberapa utas pada database yang sama, dan mengurangi kemungkinan mengulur-ulur sinkronisasi sistem file.

[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

Mengembalikan

True jika pengelogan write-ahead diaktifkan.

Atribut

Pengecualian

jika ada transaksi yang sedang berlangsung pada saat metode ini dipanggil. Mode WAL hanya dapat diubah ketika tidak ada transaksi yang sedang berlangsung.

Keterangan

Pengelogan write-ahead memungkinkan eksekusi kueri paralel dari beberapa utas pada database yang sama, dan mengurangi kemungkinan mengulur-ulur sinkronisasi sistem file. Pengelogan write-ahead secara signifikan lebih cepat dalam sebagian besar skenario.

<h3>Manfaat dan Praktik< Terbaik/h3>

Pengelogan write-ahead tidak diaktifkan secara default. Namun umumnya disarankan bagi aplikasi untuk mengaktifkan pengelogan write-ahead, kecuali aplikasi menggunakan fitur SQLite yang tidak kompatibel dengan pengelogan write-ahead.

Ketika pengelogan write-ahead diaktifkan, operasi tulis terjadi dalam file log terpisah, yang memungkinkan pembacaan di utas lain untuk dilanjutkan secara bersamaan. Saat penulisan sedang berlangsung, pembaca di utas lain akan melihat status database seperti sebelum penulisan dimulai. Ketika penulisan selesai, pembaca di utas lain kemudian akan memeriksa status baru database.

Manfaat lain dari pengelogan write-ahead adalah mengurangi jumlah fsync panggilan ke sistem file yang mendasar. fsync Panggilan dapat memblokir kunci sistem dan memiliki latensi ekor yang buruk pada perangkat dengan sistem file yang lambat.

Cara paling efisien untuk mengaktifkan pengelogan write-ahead adalah dengan meneruskan #ENABLE_WRITE_AHEAD_LOGGING bendera ke #openDatabase. Ini lebih efisien daripada memanggil #enableWriteAheadLogging. <pre> SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING, myDatabaseErrorHandler); </pre> <h3>Menonaktifkan Write-ahead Logging</h3>

Jika database memiliki database terlampir, maka eksekusi kueri secara paralel TIDAK dimungkinkan. Demikian juga, pengelogan write-ahead tidak didukung untuk database baca-saja atau database memori. Dalam kasus seperti itu, #enableWriteAheadLogging() mengembalikan false.

Ketika pengelogan write-ahead tidak diaktifkan (default, atau setelah memanggil #disableWriteAheadLogging), tidak dimungkinkan untuk membaca dan menulis terjadi pada database secara bersamaan. Sebelum memodifikasi database, penulis secara implisit memperoleh kunci eksklusif pada database yang mencegah pembaca mengakses database hingga penulisan selesai.

Pengelogan write-ahead sedikit meningkatkan penggunaan memori oleh SQLite. Anda dapat mengukur dampak pada memori menggunakan alat seperti meminfo.

<h3>Penggunaan</h3>

Setelah membuka database dengan #ENABLE_WRITE_AHEAD_LOGGING bendera atau dengan memanggil metode ini, eksekusi kueri secara paralel diaktifkan selama database tetap terbuka. Untuk menonaktifkan eksekusi kueri secara paralel, panggil #disableWriteAheadLogging atau tutup database dan buka kembali.

Eksekusi paralel kueri dilakukan dengan membuka beberapa koneksi ke database dan menggunakan koneksi database yang berbeda untuk setiap kueri. Mode jurnal database juga diubah untuk memungkinkan penulisan dilanjutkan secara bersamaan dengan bacaan. Jumlah maksimum koneksi yang digunakan untuk menjalankan kueri secara paralel tergantung pada memori perangkat dan mungkin properti lainnya.

Jika kueri adalah bagian dari transaksi, maka kueri dijalankan pada database yang sama menangani transaksi dimulai.

Penulis harus menggunakan #beginTransactionNonExclusive() atau #beginTransactionWithListenerNonExclusive(SQLiteTransactionListener) untuk memulai transaksi. Mode non-eksklusif memungkinkan file database dapat dibaca oleh utas lain yang menjalankan kueri.

Jika database memiliki database terlampir, maka eksekusi kueri secara paralel TIDAK dimungkinkan. Demikian juga, pengelogan write-ahead tidak didukung untuk database baca-saja atau database memori. Dalam kasus seperti itu, #enableWriteAheadLogging mengembalikan false.

Lihat juga Pengelogan Write-Ahead SQLite untuk detail selengkapnya tentang cara kerja pengelogan write-ahead.

Java dokumentasi untuk android.database.sqlite.SQLiteDatabase.enableWriteAheadLogging().

Bagian dari halaman ini adalah modifikasi berdasarkan pekerjaan yang dibuat dan dibagikan oleh Android Open Source Project dan digunakan sesuai dengan istilah yang dijelaskan dalam Lisensi Creative Commons 2.5 Lisensi Atribusi.

Berlaku untuk

Lihat juga