添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在默认情况下 SQLite 的事务原子提交和回滚使用的是 rollback journal 模式。但是在 3.7.0 版本(Android 9.0)中 SQLite 引入了一种新的日志模式 Write-Ahead Log (常简写为 WAL )。

一些app在android9.0使用数据库时出现错误可以看看是不是这里的问题。

默认的 rollback journal 模式工作原理大致为:写操作进行前进行数据库文件拷贝,然后对数据库进行写操作。如果发生 Crash 或者 rallback 则将日志中的原始内容回滚到数据库中进行恢复操作,否则在 Commit 完成时删除日志文件。

WAL 模式则采用了相反的做法。在进行数据库写操作时,它会先复制一份原始数据到日志文件中并且将写操作也更新到日志文件中而原有数据库内容则保存不变。如果事务失败,WAL 中的记录会被忽略;如果事务成功,它将在随后的某个时间被写回到数据库文件中二该步骤被称为 Checkpoint

在读的时候,SQLite 将在 WAL 文件中搜索,找到最后一个写入点,记住它,并忽略在此之后的写入点(这保证了读写和读读可以并行执行);随后,它确定所要读的数据所在页是否在 WAL 文件中,如果在,则读 WAL 文件中的数据,如果不在,则直接读数据库文件中的数据。

WAL性能

1.读和写可以完全地并发执行,不会互相阻塞(但是写之间仍然不能并发)。

2.WAL在大多数情况下,拥有更好的性能(因为无需每次写入时都要写两个文件)。

3.磁盘I/O行为更容易被预测。

1.访问数据库的所有程序必须在同一主机上,且支持共享内存技术。

2.每个数据库现在对应3个文件:<yourdb>.db,<yourdb>-wal,<yourdb>-shm。

3.当写入数据达到GB级的时候,数据库性能将下降。

4.3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。

WAL引入的兼容性问题

在启用了WAL之后,数据库文件格式的版本号由1升级到了2,因此,3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。

禁用WAL会使数据库文件格式的版本号恢复到1,从而可以被SQLite 3.7.0之前的版本识别。

如果对读写并发的要求低可以每次数据库打开时禁用WAL模式,即可完成app的版本兼容

在默认情况下 SQLite 的事务原子提交和回滚使用的是 rollback journal 模式。但是在 3.7.0 版本(Android 9.0)中 SQLite 引入了一种新的日志模式 Write-Ahead Log (常简写为 WAL )。一些app在android9.0使用数据库时出现错误可以看看是不是这里的问题。工作原理默认的 rollback journal 模式工作原理大...
一. 简介 SQLite 数据库 是一个轻量级的DBMS( 数据库 管理系统)。 SQLite 使用单个文件存储数据, Android 标准库包含 SQLite 库以及配套使用的一些Java辅助类。主要特点:轻量级,单一文件,跨平台,开源。 二. Android SQLite 数据库 的使用 1、创建 SQLite 数据库 SQLite Database db= SQLite Database.openOrCreateDatabase( /data/data/ + getPackageName() + /test.db, null); 执行完这条语句,可以在adb shell下进入/data/data/pac
2018年8月7日-凌晨1点,谷歌发布了 Android 9.0 操作系统,它的名字是 Android 9,被命名为 Android Pie。让我们看看关于 Android 9派你需要知道的一切。 大纲如下: Android Pie 新特性有哪些? 官方Release Note更新说明 哪些设备第一时间将集成 Android Pie? Android Pie 源码在哪里下载? Android Pie 新特...
一、什么是 WAL WAL 的全称是Write Ahead Logging,它是很多 数据库 中用于实现原子事务的一种机制, SQLite 在3.7.0版本引入了该特性。 二、 WAL 如何工作? 在引入 WAL 机制之前, SQLite 使用rollback journal 机制实现原子事务。 rollback journal 机制的原理是:在修改 数据库 文件中的数据之前,先将修改所在分页中的数据备份在另...
Android SQlite - journal 、- wal 、-shm 在创建 数据库 时,不仅会生成xxx.db 数据库 文件,而且还会生成xxx.db- journal 。这个- journal 文件是用来干嘛的?其实这个文件是 sqlite 用来实现原子提交和回滚功能的。如果没有这个文件, SQlite 将无法回滚未完成的事务,如果在事务中间发生崩溃或者掉电,那么整个 数据库 就有可能损坏。 - journal ——回滚日志 wal 提供了更多的并发性,读时不会阻塞写,写时不会阻塞读; 使用 wal 使得磁盘IO操作更加连续; wal 使用的fsync()操作要少得多,因此在fsync()系统调用中断的系统上,不太容易出现问题;
1.写在前面的话前面写过一篇关于 Sqlite 基本操作的文章,今天我们来学习 Android 中如何使用 Sqlite 以及性能优化。2. Android 平台下 数据库 相关类 SQLite OpenHelper 抽象类:通过从此类继承实现用户类,来提供 数据库 打开、关闭等操作函数。 SQLite Database 数据库 访问类:执行对 数据库 的插入记录、查询记录等操作。 SQLite Cursor 查询结构操作类:用来访
1、多线程下使用    rc = sqlite 3_open_v2(DBFILENAME, &db, SQLITE _OPEN_READWRITE | SQLITE _OPEN_FULLMUTEX, NULL); 2、多线程开启 WAL 模式:rc = sqlite 3_exec(db, "PRAGMA journal _mode= WAL ;", callback, 0, &zErrMsg); 3、 WAL
要在 Android Studio中连接 SQLite 数据库 ,您需要执行以下步骤: 1. 在您的项目中创建一个 SQLite 数据库 。您可以使用 SQLite OpenHelper类来创建和管理 数据库 。 2. 在您的项目中添加 SQLite 依赖项。您可以在build.gradle文件中添加以下代码: dependencies { implementation 'com. android .support:support- sqlite :28..' 3. 在您的代码中打开 数据库 连接。您可以使用以下代码: SQLite Database db = SQLite Database.openDatabase("path/to/database", null, SQLite Database.OPEN_READWRITE); 4. 执行SQL查询。您可以使用以下代码: Cursor cursor = db.rawQuery("SELECT * FROM my_table", null); 这些步骤将帮助您在 Android Studio中连接 SQLite 数据库