hybrid应用的database locked问题

SQLite是库级锁,支持并发读,但是不支持并发写。所以如果多个线程同时进行写操作,就有可能造成database locked问题。如果是纯原生应用,这篇文章介绍了怎么利用FMDatabaseQueue避免锁库:

使用FMDatabaseQueue避免database locked问题

但是如果是hybrid应用,就相对比较复杂,我们的APP就踩坑了。刚开始搭框架的时候,使用cordova搭建了hybrid框架,并使用SQLitePlugin,来支持js访问数据库。然后原生的部分,就用FMDB来访问数据库

一开始的时候,大部分的数据库访问都是在js里调用的,想必这个SQLitePlugin已经处理了并发写的场景,所以一直都没有出现过锁库的情况。原生的部分,一开始没有经验,遇到了锁库的问题,后来也用FMDatabaseQueue解决了。当时大部分的操作都在js里,如果涉及到原生访问数据库的场景,一般都用模态窗阻止了用户的其他操作,所以2个sqlite的入口没有发生冲突,安稳了很长时间

但是最近需求变得更复杂,出现了js和原生代码同时操作数据库的场景,结果2个队列产生了竞争,database locked的问题又开始概率出现了

所以教训就是:如果是hybrid的应用,最好在一开始的时候就要写好数据库的公共组件,SQLitePlugin肯定是用不了了,应该是自己写一个cordova plugin,调用数据库访问的公共组件,这样无论是原生的代码,还是js代码,对数据库的操作都会被FMDatabaseQueue统一放在队列里管理,才不会出现多线程并发写的问题

对于我们这种已经踩坑的来说,只有几个办法:

1、改造,弃用SQLitePlugin

2、分析代码的调用顺序,用setTimeout等办法,尽量把调用错开

3、增加异常处理,如果由于database locked而写入失败,就等待再尝试写一次

第一种方法是最彻底的,可以从根本上解决问题,但是对于一个老项目,改造起来难度比较大,第二,三种办法实现比较简单,但是都不是彻底解决问题的办法

时间: 2024-10-13 12:44:58

hybrid应用的database locked问题的相关文章

Android多线程操作sqlite(Sqlite解决database locked问题)

参考http://blog.csdn.net/sdsxleon/article/details/18259973  很好 https://github.com/2point0/Android-Database-Locking-Collisions-Example 示例 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=333473 http://bbs.51cto.com/thread-990260-1.html 用事务,速度会很会 方

安卓 SQLite error:SQLite database locked exception while compling : PRAGMA journal_mode .....

项目中频繁的切换Tab键,会频繁地从数据库读取数据,这是报出这样的错误: 解决方法是在国外的某论坛找到的 : 在插入数据的时候,首先: SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, null); db.beginTransaction();   ////开启一个事务 db.insert(HJZ_SQLiteOpenHelper.TABLE_NAME_KP, null, cv); db.setTransactionSucces

改造SQLitePlugin插件,用FMDB统一管理

接上篇博客: hybrid应用的database locked问题 我们的是hybrid应用,基于cordova.做第一个版本的时候没经验,原生的部分用FMDB访问数据库,WEB的部分就直接找了一个SQLitePlugin用.早期的时候,原生代码和js访问数据库都是错开的,所以没有发生问题.但是到了现在,有些场景需要2边一起访问数据库,由于sqlite不支持并发写,就产生了database locked问题 其实回头看,如果在首版本就基于FMDB自己写一个cordova插件提供给js调用是很容易

AWS(0) - Amazon Web Services

Computer EC2 – Virtual Servers in the Cloud EC2 Container Service – Run and Manage Docker Containers Elastic Beanstalk – Run and Manage Web Apps Lambda – Run Code in Response to Events Storage & Content Delivery S3 – Scalable Storage in the Cloud Clo

Upgrade Ver 4.3.x from 4.2.x

级到遇到个小问题,解决细节记录如下. [[email protected] ~]$ gpmigrator /usr/local/greenplum-db-4.2.7.2 /usr/local/greenplum-db-4.3.3.1 20141020:10:29:05:005944 gpmigrator:wx60:gpadmin-[INFO]:-Beginning upgrade 20141020:10:29:05:005944 gpmigrator:wx60:gpadmin-[INFO]:-C

大版本升级额外步骤

这里的大版本是指版本号的第2位数字,比如4.2.7.3升级到4.3.3.1,从4.2升级到4.3,会出现无法启动问题,提示catalog版本不兼容. 而如果只是在第2位数字之内的相同版本的升级没有此类问题:最前面的那个版本数字号由于目前还没有出现对应版本,所以没有相关问题. [[email protected] ~]$ gpstart -a 20141019:12:40:51:004622 gpstart:gtlions60:gpadmin-[INFO]:-Starting gpstart wi

[SQL in Azure] Provisioning a SQL Server Virtual Machine on Azure

http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-provision-sql-server/ Provisioning a SQL Server Virtual Machine on Azure The Azure virtual machine gallery includes several images that contain Microsoft SQL Server. You can sel

转发 FMDB多线程下"is currently in use" 或者 "database is locked" 问题

FMDB多线程下"is currently in use" 或者 "database is locked" 问题 问题一: "is currently in use" 出现的场景是这样的,多线程操作数据库,每个线程都使用了FMDatabase实例(注意没有使用FMDatabaseQueue). 问题二:“database is locked"出现的场景是这样的,多线程操作数据库,每个线程各自创建了FMDatabaseQueue实例操作数

The database could not be exclusively locked to perform the operation(SQL Server 5030错误解决办法)(转)

Microsoft SQL Server 5030错误解决办法 今天在使用SQL Server时,由于之前创建数据库忘记了设置Collocation,数据库中插入中文字符都是乱码,于是到DataBase的Options中修改Collocation,出现了The database could not be exclusively locked to perform the operation这个错误,无法修改字符集为Chinese_PRC_90_CI_AS. 解决办法找了很久才找到,如下: 1.执