WAL模式 Android,Android使用SQLITE3 WAL模式
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模式相关推荐
- Android架构篇-4 架构模式MVVM
Android架构篇-4 架构模式MVVM MVVM原理 #mermaid-svg-CJmTYPxP5GkKNMic .label{font-family:'trebuchet ms', verdan ...
- Android学习 StateMachine与State模式
2019独角兽企业重金招聘Python工程师标准>>> 一 State模式 意图: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(Objects for ...
- MVP模式在Android实际项目中的应用和优化
注:本文阅读需要对MVP模式有基本了解. MVP模式已经出现有很长一段时间了,但是火起来是这两年的事情. 关于MVP的概览,介绍,乃至于教程,Demo,实例,网上都有很多,我也有一篇文章专门收录了一些 ...
- ANDROID 中设计模式的採用--创建型模式
所谓模式就是在某一情景下解决某个问题的固定解决方式. 全部的创建型模式都是用作对象的创建或实例化的解决方式. 1 简单工厂模式 创建对象的最简单方法是使用new来创建一个对象,假设仅仅创建一种固 ...
- 【EventBus】发布-订阅模式 ( Android 中使用 发布-订阅模式 进行通信 )
文章目录 一.拷贝 发布-订阅模式 相关类 二.完整代码示例 一.拷贝 发布-订阅模式 相关类 将上一篇博客 [EventBus]发布-订阅模式 ( 使用代码实现发布-订阅模式 ) 写的 发布-订阅模 ...
- Android中常见的MVC模式
MVC模式的简要介绍 MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller). MVC模式的目的就是实现Web系统的职能分工. Model层实现系统中的业务 ...
- android oppo调试模式,OPPO A59 开启USB调试模式
我们要将OPPO A59与电脑进行连接,就必须要打开OPPO A59系统的调试模式,不同的系统版本打开调试模式的方法有所不同,在这里我们就谈谈OPPO A59各种系统版本打开USB调试模式的方法. 1 ...
- Android MVC模式在android系统中的体现
在前一段时间学习android中总是听到mvc模式,但是却不是很清楚,不过现在有了初步的了解,那么mvc的体现如下: mvc应该是M.V.C,就是指数据模型,视图,控制器: 1) 模型层(Model) ...
- Android Activity Launch Mode 启动模式详解
简介 android:launchMode 属性能设置 Activity 对象启动时是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题. 它是 Androidmanifest.x ...
最新文章
- 【迁移学习(Transfer L)全面指南】元学习
- python【蓝桥杯vip练习题库】ADV-304矩阵转置
- OpenStack架构企业IT应用的敏捷实践
- 代理(Proxy)模式
- php注释验证,注解验证 · ThinkPHP6.0完全开发手册 · 看云
- Blog小技巧之二-让朋友在Blog上也能QQ到自己
- Android 使用XmlPullParser解析xml
- 【转】C++ Vector用法深入剖析
- 百度SEO emlog虚拟源码商城模板
- oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法
- SQL HQL JPQL CQL的对比
- 防止图片盗链和资源恶意下载
- php 模拟登陆新浪微博,[Javascript] 爬虫 模拟新浪微博登陆
- 简谈浅层拷贝和深层拷贝
- 小程序登录账号 提示系统繁忙,请稍后重试
- kali19.4安装中文输入法
- 手游直播到底难在哪里?
- postgis——几何图形创建使用
- “ 异常检测 ” 研究方向文章
- php显示excel2007,PHP输出Excel PHPExcel的方法
热门文章
- 【Cocos Creator游戏开发教程】仿微信趣味画赛车小游戏(一)前言,界面UI
- 手机浏览器无法触屏滚动
- 死神[Bleach]更新...
- JavaScript-简易ATM取款机案例
- 「JVM 内存管理」低延迟的 Shenandoah GC 与 ZGC
- 研究生如何选择适合自己的导师
- jdb2 mysql io_CentOS 6.4系统中jdb2进程占用io过高的解决方法
- java.lang.SecurityException: Permission Denial
- 网页水印插件 --- gwm.js
- python仿真入门_python simulation入门