SQLite实践总结-2017-04-05

一、认识SQLite

SQLite,是一款小型的关系型数据库,在Android、iOS等嵌入式操作系统中使用,内存消耗小,处理速度也比较快,适合手机这种移动设备上使用。是属于内嵌式的数据库,数据库服务器、客户端都运行在同一个进程里面,无需网络配置、管理等操作。

数据库平时用的比较多的都是数据库升级、增删改查等等,简单的使用都不会存在什么问题,业务复杂了以后,就开始出现效率慢、多线程并发等问题,在开发阶段也踩过一些坑,总结一下经验。

二、启动事务

首先了解一下SQLite的操作原理,本身对SQLite的操作就是对文件的读写操作,SQLite是属于文件及别的锁,而且,SQLite默认会为每次的插入、更新操作,都会创建一次事务,完成之后立即提交。整个流程分三个步骤。

① 开启事务、同步数据库文件、打开数据库文件;

② 执行数据库插入、更新等操作;

③ 关闭数据库文件、同步结束、关闭事务。

但开启了事务之后,①跟③都只执行一次,所有插入、更新操作统一都在②执行,因此在速度上比较有优势。

插入5000条数据执行流程如下图

image

如图所示,频繁的打开、关闭数据库是很消耗时间和资源的,开启事务之后,时间上比未开启事务要缩短t1 * 5000 + t3 * 5000,另外CPU、内存消耗也会相应的减少,可见效率上明显提高了。

开启事务,具有更多其他的优势。例如原子性,一次性提交多个操作,要么全部成功,要么全部失败,失败后会进行回滚到修改之前的状态,避免了脏数据入库的问题。

三、多线程并发

随着业务的发展,复杂的业务不可避免的会出现多线程并发的问题,SQLite是文件级别的锁,从而实现了库级锁,粒度大,支持多线程同时读,但只支持一个线程写,因此在多线程插入、更新操作的时候,往往会出现问题

The database file is locked , database is locked

这是发生了并发操作的错误,如何避免这个问题,需要做到同一时刻只允许一个线程执行插入、更新操作。

1、可以显式使用代码同步synchronized的方式限制单线程执行;

2、每个线程显式采用前面说的事务操作,因为事务本身也会执行同步数据库文件;

3、使用单线程池的方式,所有数据库任务交由一个单线程池执行,通过Handler返回数据在UI线程展示,既不会影响UI线程,也可以防止并发带来的异常。

四、查询优化

1、异步执行,数据库操作在非UI线程执行,这个应该比较好理解;

2、按需获取数据列,可以使用select name from table,就不需要使用select * from table;

3、及时关闭cursor、db,查询完毕之后要及时关闭cursor、db,及时释放资源;

4、编译SQL,使用同一条SQL语句进行插入、更新的批量操作时,可以预先将SQL语句显式编译成SQLiteStatement以重复利用;

private void insertWithPreCompiledStatement(SQLiteDatabase db) {
    String sql = "INSERT INTO " + TableDefine.TABLE_RECORD + "( " + TableDefine.COLUMN_INSERT_TIME + ") VALUES(?)";
    SQLiteStatement statement = db.compileStatement(sql);
    int count = 0;
    while (count < 100) {
        count++;
        statement.clearBindings();
        statement.bindLong(1, System.currentTimeMillis());
        statement.executeInsert();
    }
}

5、建立索引,查询数据不用全表扫描,从而大大提高数据库查询效率。但索引会导致插入、更新等操作变慢,维护索引也需要消耗资源,我在实践中比较少利用。

五、结语

在APP业务发展得比较复杂的时候,SQLite的优化显得尤其重要,特别是针对一些需要做本地离线数据、服务器同步等业务的场景。另外,移动端开发的同学也应该多学习SQL语句的使用,在一些数据库连接查询比较多场景,使用数据库框架如ormlite难以实现的时候,再去学习如何拼SQL就显得非常吃力了。又比如,GROUP BY 和 ORDER BY一起使用时,ORDER BY要在GROUP BY的后面这种细节也容易忽视。多积累,走更长的路。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容