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而写入失败,就等待再尝试写一次
第一种方法是最彻底的,可以从根本上解决问题,但是对于一个老项目,改造起来难度比较大,第二,三种办法实现比较简单,但是都不是彻底解决问题的办法
分享到:
相关推荐
然而,在多线程环境中,由于并发访问数据库,可能会遇到“database locked”(数据库被锁定)的问题。本文将深入探讨如何在Android中使用多线程操作SQLite并解决数据库被锁定的问题。 首先,理解“database locked...
- **事务重试**:应用程序可以捕获到"database is locked"异常后,主动回滚事务并稍后重试。这种方法需要确保重试不会再次导致死锁。 - **优化事务设计**:避免长时间持有锁,尽可能减少事务的粒度,让事务快速完成...
总之,理解和妥善处理SQLite的“database is locked”错误是保障应用程序稳定运行的关键。通过优化事务管理、设置超时时间、使用WAL模式以及编写健壮的错误处理代码,可以有效地避免和解决这类问题。
sqlite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data...完美解决sqlite的 database locked 或者是 error 5: database locked 问题
We demonstrate a stable conventional soliton in a Tm-doped hybrid mode-locked fiber laser by employing a homemade all-fiber Lyot filter (AFLF) and a single-wall carbon nanotube. The AFLF, designed by ...
SQLite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data...完美解决sqlite的 database locked 或者是 error 5: database locked 问题
在日常使用SVN的过程中,开发者可能会遇到各种各样的问题,比如在执行`svn update`命令时出现“locked”的错误提示。本文将详细介绍这一问题的原因、常见场景以及如何有效解决。 #### 错误现象 当在SVN客户端执行`...
stm32 flash解锁,我的是开发板,在按键中断中解锁flash,具体的见源代码,使用ram.icf,把程序烧录在ram中,环境是IAR6.10,库版本是3.0,成功解决Core is locked-up问题。~
相位锁定环(Phase-Locked Loops, PLLs)设计与仿真 #### 定义与原理 相位锁定环(PLL)是一种用于控制两个信号之间的相位差的技术。在射频(RF)系统中,PLL被广泛应用于频率合成、时钟恢复以及其他需要精确控制频率...
在实际工作中,解决MySQL的锁问题通常需要综合运用上述方法,并结合具体的应用场景和负载情况,进行细致的分析和调整。通过优化数据库设计、改进事务管理和SQL代码,可以显著提升MySQL数据库的性能和响应速度。
今天早上打开soucesafe的时候出现提示:“the sourcesafe database has been locked by the administrator"。仔细想想, 可能是前天晚上用"f:analyze.exe" -I- -DB -F -V3 -D "f:vssDatadata" 命今分析的时候锁定了...
### ORACLE应用中常见的傻瓜问题1000问(精选知识点解析) #### 知识点1:如何查看系统被锁的事务时间? 在Oracle数据库中,了解哪些对象被锁定以及锁定的时间对于诊断性能问题至关重要。你可以使用以下SQL查询来...
"PLL(Phase Locked Loop)锁相环" PLL(Phase Locked Loop)锁相环是一种反馈控制电路,用于统一整合时脉讯号,使内存能正确的存取资料。在电子设备中,PLL广泛应用于振荡器中的反馈技术。 PLL锁相环的基本组成包括...
### Oracle账户锁定问题详解与解决方法 在Oracle数据库管理中,遇到账户被锁定的问题是非常常见的。...需要注意的是,在处理此类问题时,应保持足够的耐心,并仔细检查每一个步骤,避免因操作不当导致问题复杂化。
在本文中,我们将深入探讨Laravel开发中的"locked"特性,这是一个用于在特定日期之后锁定应用程序的工具。Laravel作为一款流行的PHP框架,以其优雅的语法、强大的功能和丰富的生态系统深受开发者喜爱。"locked"包的...
标题中的"SPM.rar_laser_mode locked_mode-locked_spm_激光"暗示了这是一个关于锁模激光技术的文件,特别是涉及到自相位调制(Self-Phase Modulation, SPM)的研究。锁模激光是一种特殊的激光操作模式,通过在激光器...
《iOS游戏应用源代码解析——基于imrank1-Locked-7160518项目》 在iOS开发领域,源代码是理解游戏运行机制、优化性能和学习新技术的重要资源。"imrank1-Locked-7160518.zip"这个压缩包中包含了名为"imrank1-Locked-...
CD-Rom for the book "Phase-Locked Loops Design,Simulation and Applications by R.E.Best. A design program for Phase-locked loops circuits
锁相环(Phase-Locked Loop,PLL)是现代电子技术中不可或缺的一部分,广泛应用于通信系统、计算机系统、音频/视频处理等多个领域。它的主要功能是通过反馈控制系统确保一个信号源产生的信号与参考信号在频率上保持...