Sqlite多线程相关整理

摘要:
SQLite允许多个进程同时打开数据库文件,并允许多个过程同时读取数据库。SQLite是线程安全的。SQLite是线程安全的,因为它使用互斥锁来序列化对公共数据结构的访问。因此,如果不需要SQLite是线程安全的,那么应该禁用互斥锁以获得最佳性能。Sqlite的线程安全与传统的线程安全有什么区别?Threadsafe意味着在正确设置的前提下,多个线程同时访问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多线程相关整理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python线程互斥锁Lock(29)GitHub 访问不了?教你几招轻松解决下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【面试】iOS 开发面试题(二)

1. 我们说的oc是动态执行时语言是什么意思?  答案:多态。主要是将数据类型的确定由编译时,推迟到了执行时。  这个问题事实上浅涉及到两个概念。执行时和多态。  简单来说。执行时机制使我们直到执行时才去决定一个对象的类别,以及调用该类别对象指定方法。  多态:不同对象以自己的方式响应同样的消息的能力叫做多态。意思就是如果生物类(life)都用有一个同样...

php集成环境

apache+php+mysql是常见php环境,在windows下也称为WAMP,对于初学者自选版本搭建总是会遇到一些麻烦,下面是收集到的一些集成环境安装: 1.AppServ (推荐,简洁精简) 主页http://www.appservnetwork.com/ 当前的两个版本是:2.5.102.6.0(点击版本号下载) AppServ是PHP网页架站工...

oracle的sqlnet.ora,tnsnames.ora,listener.ora三个配置文件

总结:1 .三个配置文件都是放在$ORACLE_HOME etworkadmin目录下。2 .sqlnet.ora确定解析方式3 .listener.ora上设SID_NAME,通常用于JDBC访问,对应的错误码为125054 .tnsnames.ora上设SERVICE_NAME,通常用于linux sqlplus客户端,对应的错误码为12514 sql...

视图的用处

    以往当我们查询数据时,一定要很认真的地从设计 select语句开始,将需要查询的每个字段写在sql语句里,每次你要以同样的条件来查询数据时,那么每次都要重复输入相同的查询语句,效率很低。若将这个经常要重复使用的查询语句创建成视图,就不用那么麻烦了!直接用select * from 视图名就行了,其实将查询语句创建成视图,不仅仅是简化查询的动作;更重要...

多线程下C#如何保证线程安全?

  多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题。所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。 线程安全问题都是由全局变量及静态变量引起的。   为了保证多线程情况下,访问静态变量的安全,可以用锁机制来...

python连接mysql并进行增删改查操作

查询了菜鸟教程以及博客园等各种文章,有修改完善 转载自https://www.cnblogs.com/yuhou/p/10893056.html 自己完善部分: python连接mysql使用连接池: 一、为什么要用连接池? 1、数据库 本身有压力,并不能创建太多的并发数访问数据库,如果是大表那更加会有压力,因此限制一定的连接是更加科学的方法。2、创建和释...