sqlite是支持writeaheadlogging(WAL)模式的,开启WAL模式可以提高写入数据库的速度,读和写之间不会阻塞,但是写与写之间依然是阻塞的,但是如果使用默认的TRUNC

sqlite是支持write ahead logging(WAL)模式的,开启WAL模式可以提高写入数据库的速度,读和写之间不会阻塞,但是写与写之间依然是阻塞的,但是如果使用默认的TRUNCATE模式,当写入数据时会阻塞android中其他线程或者进程的读操作,并发降低。 相反,使用WAL可以提高并发。 由于使用WAL比ROLLBACK JOURNAL的模式减少了写的I/O,所以写入时速度较快,但是由于在读取数据时也需要读取WAL日志验证数据的正确性,所以读取数据相对要慢。 所以大家也要根据自己应用的场景去使用这种模式。

那么在android中如何开启WAL模式呢?

看SQLiteDatabase开启WAL的核心方法源码。

public boolean enableWriteAheadLogging() {

// make sure the database is not READONLY. WAL doesn't make sense for readonly-databases.

if (isReadOnly()) {

return false;

}

// acquire lock - no that no other thread is enabling WAL at the same time

lock();

try {

if (mConnectionPool != null) {

// already enabled

return true;

}

if (mPath.equalsIgnoreCase(MEMORY_DB_PATH)) {

Log.i(TAG, "can't enable WAL for memory databases.");

return false;

}

// make sure this database has NO attached databases because sqlite's write-ahead-logging

// doesn't work for databases with attached databases

if (mHasAttachedDbs) {

if (Log.isLoggable(TAG, Log.DEBUG)) {

Log.d(TAG,

"this database: " + mPath + " has attached databases. can't  enable WAL.");

}

return false;

}

mConnectionPool = new DatabaseConnectionPool(this);

setJournalMode(mPath, "WAL");

return true;

} finally {

unlock();

}

}

在源码的注释中是这样写到:“This method enables parallel execution of queries from multiple threads on the same database.” 通过此方法可以支持多个线程并发查询一个数据库。 并在注释中给出了实例代码如下:

SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename",

cursorFactory,CREATE_IF_NECESSARY, myDatabaseErrorHandler);

db.enableWriteAheadLogging();

通过调用db.enableWriteAheadLogging即可开启WAL模式。 在enableWriteAheadLogging方法中关注的核心点:

mConnectionPool = new DatabaseConnectionPool(this);

setJournalMode(mPath, "WAL");

1.创建数据库连接池,由于要支持并发访问所以需要连接池的支持。

2.调用setJournalMode设置模式为WAL.

当开启了WAL模式之后,事务的开始需要注意,在源码的注释是这样写到。

Writers should use {@link #beginTransactionNonExclusive()} or

* {@link #beginTransactionWithListenerNonExclusive(SQLiteTransactionListener)}

调用者需要使用beginTransactionNonExclusive或者beginTransactionWithListenerNonExclusive来开始事务,也就是执行:BEGIN IMMEDIATE; 支持多并发。

注:关于EXCLUSIVE与IMMEDIATE模式请参考我的另一篇博客

WAL模式 Android,Android使用SQLITE3 WAL模式相关推荐

  1. Android架构篇-4 架构模式MVVM

    Android架构篇-4 架构模式MVVM MVVM原理 #mermaid-svg-CJmTYPxP5GkKNMic .label{font-family:'trebuchet ms', verdan ...

  2. Android学习 StateMachine与State模式

    2019独角兽企业重金招聘Python工程师标准>>> 一 State模式 意图: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(Objects for ...

  3. MVP模式在Android实际项目中的应用和优化

    注:本文阅读需要对MVP模式有基本了解. MVP模式已经出现有很长一段时间了,但是火起来是这两年的事情. 关于MVP的概览,介绍,乃至于教程,Demo,实例,网上都有很多,我也有一篇文章专门收录了一些 ...

  4. ANDROID 中设计模式的採用--创建型模式

     所谓模式就是在某一情景下解决某个问题的固定解决方式. 全部的创建型模式都是用作对象的创建或实例化的解决方式. 1 简单工厂模式 创建对象的最简单方法是使用new来创建一个对象,假设仅仅创建一种固 ...

  5. 【EventBus】发布-订阅模式 ( Android 中使用 发布-订阅模式 进行通信 )

    文章目录 一.拷贝 发布-订阅模式 相关类 二.完整代码示例 一.拷贝 发布-订阅模式 相关类 将上一篇博客 [EventBus]发布-订阅模式 ( 使用代码实现发布-订阅模式 ) 写的 发布-订阅模 ...

  6. Android中常见的MVC模式

    MVC模式的简要介绍 MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller). MVC模式的目的就是实现Web系统的职能分工. Model层实现系统中的业务 ...

  7. android oppo调试模式,OPPO A59 开启USB调试模式

    我们要将OPPO A59与电脑进行连接,就必须要打开OPPO A59系统的调试模式,不同的系统版本打开调试模式的方法有所不同,在这里我们就谈谈OPPO A59各种系统版本打开USB调试模式的方法. 1 ...

  8. Android MVC模式在android系统中的体现

    在前一段时间学习android中总是听到mvc模式,但是却不是很清楚,不过现在有了初步的了解,那么mvc的体现如下: mvc应该是M.V.C,就是指数据模型,视图,控制器: 1) 模型层(Model) ...

  9. Android Activity Launch Mode 启动模式详解

    简介 android:launchMode 属性能设置 Activity 对象启动时是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题. 它是 Androidmanifest.x ...

最新文章

  1. 【迁移学习(Transfer L)全面指南】元学习
  2. python【蓝桥杯vip练习题库】ADV-304矩阵转置
  3. OpenStack架构企业IT应用的敏捷实践
  4. 代理(Proxy)模式
  5. php注释验证,注解验证 · ThinkPHP6.0完全开发手册 · 看云
  6. Blog小技巧之二-让朋友在Blog上也能QQ到自己
  7. Android 使用XmlPullParser解析xml
  8. 【转】C++ Vector用法深入剖析
  9. 百度SEO emlog虚拟源码商城模板
  10. oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法
  11. SQL HQL JPQL CQL的对比
  12. 防止图片盗链和资源恶意下载
  13. php 模拟登陆新浪微博,[Javascript] 爬虫 模拟新浪微博登陆
  14. 简谈浅层拷贝和深层拷贝
  15. 小程序登录账号 提示系统繁忙,请稍后重试
  16. kali19.4安装中文输入法
  17. 手游直播到底难在哪里?
  18. postgis——几何图形创建使用
  19. “ 异常检测 ” 研究方向文章
  20. php显示excel2007,PHP输出Excel PHPExcel的方法

热门文章

  1. 【Cocos Creator游戏开发教程】仿微信趣味画赛车小游戏(一)前言,界面UI
  2. 手机浏览器无法触屏滚动
  3. 死神[Bleach]更新...
  4. JavaScript-简易ATM取款机案例
  5. 「JVM 内存管理」低延迟的 Shenandoah GC 与 ZGC
  6. 研究生如何选择适合自己的导师
  7. jdb2 mysql io_CentOS 6.4系统中jdb2进程占用io过高的解决方法
  8. java.lang.SecurityException: Permission Denial
  9. 网页水印插件 --- gwm.js
  10. python仿真入门_python simulation入门