Sqlite多线程相关整理
Sqlite多线程相关整理
Sqlite With MultiThreads
什么是线程安全?
当多个线程访问某个方法时,不管你通过怎样的调用方式、或者说这些线程如何交替地执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。
一 来自官方FAQ
https://www.sqlite.org/faq.html#q5
https://www.sqlite.org/threadsafe.html
https://blog.csdn.net/u012890196/article/details/32338505
同一应用程序的多个应用程序或多个实例可以同时访问单个数据库文件吗?
多个进程可以同时打开同一个数据库。多个进程可以同时执行SELECT。但是,只有一个进程可以随时对数据库进行更改。
SQLite使用读取器/写入器锁来控制对数据库的访问。(在Win95 / 98 / ME下,缺少对读取器/写入器锁的支持,而是使用概率模拟。)但请注意:如果数据库文件保存在NFS文件系统上,则此锁定机制可能无法正常工作。这是因为许多NFS实现都会破坏fcntl()文件锁定。如果多个进程可能同时尝试访问该文件,则应避免将SQLite数据库文件放在NFS上。在Windows上,Microsoft的文档说如果您没有运行Share.exe守护程序,则在FAT文件系统下锁定可能不起作用。对Windows有很多经验的人告诉我,网络文件的文件锁定是非常错误的,并且不可靠。如果他们说的是真的,
我们知道没有其他嵌入式 SQL数据库引擎支持与SQLite一样多的并发性。SQLite允许多个进程一次打开数据库文件,并允许多个进程一次读取数据库。当任何进程想要写入时,它必须在更新期间锁定整个数据库文件。但这通常只需要几毫秒。其他流程只是等待作者完成然后继续他们的业务。其他嵌入式SQL数据库引擎通常只允许单个进程一次连接到数据库。
但是,客户端/服务器数据库引擎(如PostgreSQL,MySQL或Oracle)通常支持更高级别的并发性,并允许多个进程同时写入同一数据库。这在客户端/服务器数据库中是可能的,因为总有一个良好控制的服务器进程可用于协调访问。如果您的应用程序需要大量并发,那么您应该考虑使用客户端/服务器数据库。但经验表明,大多数应用程序需要的并发性远低于设计人员的想象。
当SQLite尝试访问由另一个进程锁定的文件时,默认行为是返回SQLITE_BUSY。您可以使用sqlite3_busy_handler()或sqlite3_busy_timeout() API函数从C代码调整此行为 。
精简版:
对于读操作:多个进程可以同时进行数据库的查询。
对于写操作:同一时间只有一个进程可以进行写操作。
多进程写操作在以下情况下可能会导致错误:
- NFS filesystem (NFS文件系统)
- FAT filesystems With running the Share.exe daemo (没有运行Share.exe的FAT文件系统)
- DataBase is network files (将数据库作为一个网络文件)
SQLite线程安全吗?
线程是邪恶的。避免他们。
SQLite是线程安全的。我们做出这种让步,因为许多用户选择忽略前一段中给出的建议。但为了保证线程安全,必须在SQLITE_THREADSAFE预处理器宏设置为1的情况下编译SQLite。分发中的Windows和Linux预编译二进制文件都是以这种方式编译的。如果您不确定要链接的SQLite库是否被编译为线程安全,您可以调用sqlite3_threadsafe() 接口来查找。
SQLite是线程安全的,因为它使用互斥锁来序列化对公共数据结构的访问。但是,获取和释放这些互斥锁的工作会使SQLite略微减慢。因此,如果您不需要SQLite是线程安全的,则应禁用互斥锁以获得最佳性能。有关其他信息,请参阅线程模式文档。
在Unix下,你不应该通过fork()系统调用将一个开放的SQLite数据库带入子进程。
从哪个版本开始线程安全?
简单来说,从3.3.1版本开始,它就是线程安全的了。
Sqlite的线程安全和传统意义上的线程安全有什么不同?
threadsafe就是指在设置正确的前提下,多线程同时访问SQLite并不会影响数据库的完整性,而不是说每个线程对数据库所有的操作都可以保证正确执行。
二 我的多线程解决方案
在每个线程操作数据库时,手动加锁
形成一个操作队列,统一去操作数据库(FMDB,GCD)
Sqlite多线程相关整理的更多相关文章
- android中与SQLite数据库相关的类
为什么要在应用程序中使用数据库?数据库最主要的用途就是作为数据的存储容器,另外,由于可以很方便的将应用程序中的数据结构(比如C语言中的结构体)转化成数据库的表,这样我们就可以通过操作数据库来替代写一堆 ...
- SQLite多线程下的并发操作
标签: sqlite多线程数据库跨平台嵌入式class 2011-04-14 13:29 26939人阅读 评论(2) 收藏 举报 这两天一直在捣鼓SQLite数据库,基本的操作就不说了,比较简单,打 ...
- CoreData和SQLite多线程访问时的线程安全
关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常 ...
- Java多线程相关的
很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...
- 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例
你所不知道的 CSS 阴影技巧与细节 关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow ...
- git相关整理
title: git相关整理 toc: false date: 2018-09-24 20:42:55 git merge 和 git merge --no--ff有什么区别? git merge命令 ...
- Java多线程相关面试题及答案-整理
1.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成 ...
- Android数据库相关整理
今天对Android中数据库相关的操作和代码做了一个整理,便于自己之后的查阅.主要内容有: 1.原生数据库写法 2.终端进sqlite的操作 3.第三方库 4.事务处理 5.权限和路径 一.原生数据库 ...
- 多线程相关------临界区CriticalSection
多线程一直是短板,整理相关知识方便查询 临界区(Critical Section) 临界区是一段供线程独占式访问的代码.在任意时刻,若有一个线程正在访问该代码段,如果其他所有试图访问的线程都将被挂起, ...
随机推荐
- 项目警告:There are multiple modules with names that only differ in casing.This can lead to unexpected behavior when compiling on a filesystem with other case-semantic.Use equal casing. Compare these modul
记录个自己遇到的问题: 上星期项目刚拉取下来的时候运行没有任何警告,晚上回去vscode提示更新新的东西,当时没管就立即更新了,第二天重启项目直接一大堆警告冒了出来: There are multip ...
- 使用tensorboard报错 ImportError: No module named past.builtins
安装 future pip install future conda install future
- 2019-4-15-VisualStudio-如何在-NuGet-包里面同时包含-DEBUG-和-RELEASE-的库
title author date CreateTime categories VisualStudio 如何在 NuGet 包里面同时包含 DEBUG 和 RELEASE 的库 lindexi 20 ...
- java中多线程产生死锁的原因以及解决意见
1. java中导致死锁的原因 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结 ...
- webapi JWT 认证
第一步 使用ng安装JWT组件 第二步 编写登录和生成token代码 byte[] key = Encoding.UTF8.GetBytes("123456789aaaaaaa") ...
- rsync+inotify同步备份文件
前言 rsync作用:man rsync可以看到解释为a fast, versatile, remote (and local) file-copying tool,主要进行文件的同步. inotif ...
- leetcood学习笔记-204-计算质数
题目描述: 第一次提交;(超时): class Solution: def countPrimes(self, n: int) -> int: count = 0 for i in range( ...
- delphi常见的错误
******************************* * 编 译 错 误 信 息 * ******************************* ';' not allowed befo ...
- 一张图看懂阿里云网络产品【十五】IPv6 解决方案
摘要: 作为国内首家全面支持IPv6的云厂商,阿里云12月再次推出全栈IPv6解决方案,核心产品已全面支持,协助客户小时/天级即可完成IPv6 访问.方案成功历经优酷.淘宝.天猫.双十一考验.SLB ...
- 帝国cms批量更新内容页
系统设置->数据更新->批量更新信息页地址 系统设置->数据更新->数据整理: 再更新整站主要页面即可