首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android Sqlite并发问题

error code 5: database is locked,经过查找发现code为5代表sqlite中的SQLITE_BUSY异常,详见:https://www.sqlite.org/rescode.html...#busy,这里面说,SQLITE_BUSY(5)异常是一个数据库文件在被其他不同的数据库连接进行并发操作的时候写操作将补发继续,通常是多个进程的不同数据库连接对同一个数据库进行并发操作,例如进程A在进行耗时的数据库事务...,而于此同时进程B也要进行一个数据库事务,这时候进程B就会直接返回SQLITE_BUSY的错误码,因为sqlite只能支持同一个时刻只能有一个写操作,所以解决这个问题的方法就是避免不同进程分别对同一个数据库各自开启一个...app进程来操作的了,就不会出现如上的异常 拓展 上面提及的数据库操作异常的code是5,对应的是SQLITE_BUSY,这里还有一个相似的数据库操作异常,code为6,对应的是SQLITE_LOCKED...,详见:https://www.sqlite.org/rescode.html#busy,具体意思就是说,SQLITE_LOCKED错误码是在同一个数据库连接存在冲突,或者不同的数据库连接共享相同的数据库缓存存在冲突的时候

1.5K40

微信 iOS SQLite 源码优化实践

重试一定次数依然失败后,则返回SQLITE_BUSY错误码。 3. SQLite Busy Retry 方案的不足 Busy Retry 的方案虽然基本能解决问题,但对性能的压榨做的不够极致。...在 Retry 过程中,休眠时间的长短和重试次数,是决定性能和操作成功率的关键。 然而,它们的最优值,因不同操作不同场景而不同。...然后比较状态量,若当前状态不可跳转,则返回SQLITE_BUSY 通过fcntl进行文件锁,防止其他进程介入。...若锁失败,则返回SQLITE_BUSY 而 SQLite 选择 Busy Retry 的方案的原因也正是在此---文件锁没有线程锁类似 pthread_cond_signal 的通知机制。...该方案上线后,卡顿检测系统检测到 等待线程锁的造成的卡顿下降超过90% SQLITE_BUSY 的发生次数下降超过95% I/O 性能优化 保留 WAL 文件大小 如上文多线程优化时提到,开启 WAL

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    微信 iOS SQLite 源码优化实践

    SQLite提供了Busy Retry的方案,即发生阻塞时,会触发Busy Handler,此时可以让线程休眠一段时间后,重新尝试操作。重试一定次数依然失败后,则返回SQLITE_BUSY错误码。...然而,它们的最优值,因不同操作不同场景而不同。若休眠时间太短或重试次数太多,会空耗CPU的资源;若休眠时间过长,会造成等待的时间太长;若重试次数太少,则会降低操作的成功率。...然后比较状态量,若当前状态不可跳转,则返回SQLITE_BUSY 2、通过fcntl进行文件锁,防止其他进程介入。...若锁失败,则返回SQLITE_BUSY 而SQLite选择Busy Retry的方案的原因也正是在此---文件锁没有线程锁类似pthread_cond_signal的通知机制。...该方案上线后,卡顿检测系统检测到 等待线程锁的造成的卡顿下降超过90% SQLITE_BUSY的发生次数下降超过95% I/O 性能优化 保留WAL文件大小 如上文多线程优化时提到,开启WAL模式后

    3.9K13

    因工作站与主要域间的信任关系失败而导致请求失败_此工作站和域控不信任

    在服务器的日志上,这个错误应该大家都不陌生了,错误的特征,我给大致描述一下: 在域中总是会有计算机由于某种原因,导致计算机账户的密码无法和lsa secret同步 系统会在计算机登陆到域的时候,...我的解决办法是: 先使用本地管理员账户连接到工作站(此时,由于丢失了和域的信任关系,domain admins 无法登陆到工作站),nslookup确认dns解析的正常。确认dns 后缀是否正确。...由于这样的问题一直没有得到官方的答案,特地询问了微软的工程师,陆续的回答中我做了一些整理如下: 通常情况下,我们建议客户采取下面的措施: 1 不要在客户机上长时间不登陆域。...2 把客户机从域中移走时,尽量先移到工作组中,而不是直接重装。否则要注意删掉相应的机器帐号。 3 域中的机器时间要同步。 4 把客户机加入域之前,确认域中没有其他同名的机器帐号。...后面我查到kb中还有一个关于此问题的论述: 如果确实有固定的机器是频繁的发生这种事情,可以修改本地计算机注册表禁止计算机和dc之间的这个定期的密码同步动作。

    1.1K60

    SQLite这么娇小可爱,不多了解点都不行啊

    一旦一个连接获得了RESERVED锁,它就可以将数据写入缓冲区,而不是实际地写到磁盘。...但是,别的连接可以对数据库进行读操作;但是,RESERVED锁会阻止其它连接的BEGIN IMMEDIATE或者BEGIN EXCLUSIVE命令,当其它连接执行上述命令时,会返回SQLITE_BUSY...这时你就可以对数据库进行修改操作了,但是你还不能提交,当你 COMMIT时,会返回SQLITE_BUSY错误,这意味着还有其它的读事务没有完成,得等它们执行完后才能提交事务。...rollback journal机制的原理是:在修改数据库文件中的数据之前,先将修改所在分页中的数据备份在另外一个地方,然后才将修改写入到数据库文件中;如果事务失败,则将备份数据拷贝回来,撤销修改;如果事务成功...WAL机制的原理是:修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改

    1.3K80

    sqlite3 多线程问题..

    如果有多进程可能并发读数据库则因当避免把数据库文件放在 NFS 文件系统中。 根据微软的文档,如果不运行 Share.exe 后台程序则 FAT 文件系统中的锁定可能不工作。...事实上,经验告诉 我们大多数应用所需要的并发度比他们的设计者们想象的要少得多。 当 SQLite 尝试操作一个被另一个进程锁定的文件时,缺省的行为是返回 SQLITE_BUSY。...为了线程安全,SQLite 必须在编译时把 THREADSAFE 预处理宏设为1。在缺省的发行的已编译版本中 Windows 版的是线程安全的,而 Linux 版的不是。...而不是在多线程中同时使用同一个 sqlite3 结构指针。 一个sqlite3结构只能在调用 sqlite3_open创建它的那个进程中使用。...由于SQLite依赖fcntl()锁来进行并发控制,当在线程间传递数据库连接时会出现严重的问题。

    3.9K21

    【Dev Club 分享】微信 iOS SQLite 源码优化实践

    重试一定次数依然失败后,则返回 SQLITE_BUSY 错误码。 下面这段代码是 SQLite 默认的 Busy Handler ?...然而,它们的最优值,因不同操作不同场景而不同。若休眠时间太短或重试次数太多,会空耗 CPU 的资源;若休眠时间过长,会造成等待的时间太长;若重试次数太少,则会降低操作的成功率。如下图 ?...然后比较状态量,若当前状态不可跳转,则返回 SQLITE_BUSY 通过 fcntl 进行文件锁,防止其他进程介入。...若锁失败,则返回 SQLITE_BUSY 而 SQLite 选择 Busy Retry 的方案的原因也正是在此 文件锁没有线程锁类似 pthread_cond_signal 的通知机制。...这次也只尝试了对 SQLite 原有的方案进行优化,而市面上还有许多优秀的数据库,如 LevelDB、RocksDB、Realm 等,它们采用了和 SQLite 不同的实现原理。

    1.5K80

    iOS开发之SQLite-C语言接口规范(二) —— Prepared Your SQL Statements

    在《SQLite的C语言接口规范(一)》中介绍了如何去连接打开数据库,本篇博客就介绍如何操作数据库,本篇主要给出了如何执行数据库查询语句(Select), 然后遍历结果集。...数据库连接必须没有被关闭。     2. zSql是第二个参数, 他的编码格式是UTF-8或UTF-16, 它就是将会被预先编译成字节码的SQL语句。...而之前的做法是返回一个通用的错误结果代码SQLITE_ERROR,而你不得不去调用sqlite3_reset()方法来查找问题。在“v2”预编译接口中将会立即返回错误原因。     ...sqlite3_step()接口去执行预编译后的语句,也会返回一些结果代码,下面介绍一些常用的结果代码:SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR...SQLITE_BUSY 意味着数据库引擎无法获得所需的数据库锁然后做它的工作。如果语句是commit或执行一个外部的显式事务,你可以重试。

    1.1K60

    springboot集成sqlite数据库

    .open test.db 格式化输出 执行命令 .header on .mode column .timer on 展示效果 连接数据sqlite navicat 连接数据sqlite jdbc...=1 # 此属性控制从池返回的连接的默认自动提交行为,默认值:true spring.datasource.hikari.auto-commit=true # 连接池名称 # 此属性控制池中连接的最长生命周期...1 注意:spring.datasource.url数据库连接也可以用相对路径方便测试,部署时候使用相对路径时将sqlite一并打入到相应的路径就可以了。...支持多线程查询,但不支持多线程修改,不然会抛出异常[SQLITE_BUSY] The database file is locked (database is locked) 数据恢复 在服务启动目录下...sqlite 会自动生产spy.log 根据时间戳查找某时刻需要恢复的数据

    3.2K10

    sqlite数据存储(2)

    open() 和 sqlite3_open_v2() 使用 UTF-8 来解析文件名 sqlite3_open16() 使用 UTF-16 来解析文件名 返回值 : 成功 SQLITE_OK ,失败会返回错误代码...denied */ #define SQLITE_ABORT 4 /* Callback routine requested an abort */ #define SQLITE_BUSY...Otherwise, SQLITE_BUSY is returned and the ** database connection remains open. */ int sqlite3_close(...(*sqlite3_callback)(void*,int,char**, char**); 回调函数是作为 sqlite3_exec 第三个参数而存在的,它的作用在于处理返回的每条结果 一般而言,回调函数的返回结果都是...__THROW; 在构建 SQL 语句的过程中会经常使用到 sprintf ,它和 printf 的用法相似,但是将结果写到一个字符数组中,而不是直接打印到了终端上,这样便于后期的处理 ---- 总结

    57630

    Sqlite3详细解读

    不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。...所以客户应用程序可以通过sqlite3_open_xxx函数连接到名为filename的数据库,并通过参数ppDb返回指向该数据库数据结构的指针。...如果在调用sqlite3_close函数关闭数据库之前,还有某些没有完成的(nonfinalized)SQL语句,那么sqlite3_close函数将会返回SQLITE_BUSY错误。...这个接口需要一个数据库连接指针以及一个要准备的包含SQL语句的文本。...// 返回SQLITE_BUSY表示暂时无法执行操作,SQLITE_DONE表示操作执行完毕,SQLITE_ROW表示执行完毕并且有返回(执行select语句时)。

    3.7K10

    微信客户端性能监控和优化简述

    SQLite 和耗时监控,涉及较细力度的插桩,会有一定的性能损耗,前者主要用于开发和自动化测试阶段,后者对现网用户做了一定的采样。 InfoQ:微信客户端在性能上有哪些优化点?...网络方面,在 IPList 选择策略、复合连接、连接耗时和稳定性、收发包耗时和稳定性、协议包压缩精简等诸多方面均作了长期的优化措施;针对安卓的后台长连接这一项,研发团队就在心跳策略、Push 及时性等方面做了很多工作...源码,大幅度降低了 SQLITE_BUSY 的发生次数;通过配置 DB 文件和 WAL 文件的 mmap 模式,对 DB 的 IO 性能也有不少的提升。...其中 Mars 全部使用 C/C++ 开发,可适用于 iOS、Android、Windows 和 Mac 等平台;而 WCDB 主要根据 iOS(MacOS)和 Android 两个平台提供了不同的语言适配...,但底层的 SQLite 源码优化和 RepairKit,还是继续采用 C/C++ 开发。

    2.3K20

    ios在SQLite3基本操作

    在项目中加入iPhone版的sqlite3的数据库的开发包。在项目下的Frameworks点击右键。然后选择libsqlite3.0.dylib文件。...运行过程 int sqlite3_step(sqlite3_stmt*); 可能的返回值: *SQLITE_BUSY: 数据库被锁定,须要等待再次尝试直到成功。...重置过程的运行 int sqlite3_reset(sqlite3_stmt *pStmt); 过程将回到没有运行之前的状态,绑定的參数不会变化。...SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL) 注意:假设对该列使用了不同与该列本身类型适合的数据读取方法,得到的数值将是转换过的结果。 4....因為假设不希望該資料庫在每次 app 版本号更新後,都會被覆蓋掉,就得做檔案存在與否的判斷。 讀取資料庫 有成功 open 資料庫之後。就能够开始進行讀寫了。

    72510

    为什么要从 FMDB 迁移到 WCDB?

    平滑迁移 文件格式 由于 FMDB 和 WCDB 都基于 SQLite ,因此两者在数据库的文件格式上一致。用 FMDB 创建、操作的数据库,可以直接通过 WCDB 打开、使用。...性能比较 对于已经上线运行的项目,解决性能瓶颈会是一个常见的迁移理由。相较于 FMDB 直白的封装, WCDB 上到 OC 层的 ORM ,下到 SQLite 源码,都做了各类性能优化。...读操作性能测试 写操作性能测试 批量写操作性能测试 (事务) 对于读操作,SQLite 速度很快,因此封装层的消耗占比较多。...在多线程写操作的测试中, FMDB 直接返回错误 SQLITE_BUSY,无法完成。...初始化性能测试 SQLite 连接的初始化速度会随着数据库内表的数量增加而逐渐上升, WCDB 也针对这个场景做了优化。

    3K00

    使用iOS原生sqlite3框架对sqlite数据库进行操作

    在需要操作sqlite数据的文件中导入如下头文件: #import sqlite3.h> 数据库文件的操作是由一个sqlite3类型的指针操作管理的,如下方法进行数据库的打开: sqlite3 *sqlite...         3   /* 没有访问权限 */ #define SQLITE_ABORT        4   /* 回调请求终止 */ #define SQLITE_BUSY         5   .../* 数据库文件被锁定 */ #define SQLITE_LOCKED       6   /* 数据库中有表被锁定 */ #define SQLITE_NOMEM        7   /* 分配空间失败...数据库磁盘格式不正确 */ #define SQLITE_NOTFOUND    12   /* 调用位置操作码 */ #define SQLITE_FULL        13   /* 由于数据库已满造成的添加数据失败...如果不存在则会创建  *  *  @param name 数据库名称  *  *  @return 数据库操作对象 如果创建失败会返回nil  *  */ +(YHBaseSQLiteContext *

    2.2K10

    性能&分布式&NewLife.XCode对无限数据的支持

    因为担心TCP链接数限制,没有采用TCP通讯,而直接使用WebService+IIS。开了三四个IIS站点,缓存全开的情况下,每个进程占用200M到500M内存。...SQLite 重要表个数:7 重要表数据量:20,000,000 数据增长速度:每1小时2万条     1,采集子系统,采集到的数据写入一个SQLite,采集过程中也需要查询     2,数据整理子系统...2,采集和网站数据库分离,开始的时候采集也是写入MSSQL,显然,这会让MSSQL变得很忙,并且会带来因采集而导致网站不正常的风险。     3,缓存。...当然,这其中还是有一些问题的     1,SQLite写入频繁,偶尔发生多线程冲突,XCode中的SQLite提供者增加了失败重试机制,降低了冲突几率,大概万分之一     2,SQLite数据增长过快...可以使用多个MSSQL服务器,假如10个,配置文件中配置10个对应的连接字符串,重载实体类的查询方法,查询之前动态修改连接名。至于该使用哪一个连接名,就看自己实现的算法了,最简单的就是轮询或者随机。

    96680
    领券