SQLite多线程并发操作

  • 先理清楚一个概念 多线程操作多数据库连接操作是不同的概念

  • 多线程操作:多线程操作数据库时可以使用一个数据库连接,也可以每个线程使用各自的数据库连接

  • 多数据库连接操作:即每个数据库操作使用的是各自的数据库连接

  • SQLite默认情况下只支持单个数据库连接操作,多连接并发操作时会出问题,需要开启wal模式才能进行多项城并发读操作,写操作仍能不可以并发。

如何理解?

  • SQLite数据库仍能是一个文件,没有锁机制并发写操作是有问题的,所以最多只能实现并发读操作。

两种解决方案

  • 1、多线程读,多线程写,只使用共同一个数据库连接,即使用同一个SQLiteHelper连接
  • 这种情况下由于使用的是同一个数据库连接,SQLite内部有锁机制,不会出现异常。这种多线程操作并不是真正的并发操作,由于锁机制的存在所以仍能是阻塞的。
  • 2、多线程读,单线程写,每个线程使用各自独立的数据库连接,但是需要开启wal模式,以开启数据库连接池
  • 这种情况下是真的实现了多线程并发读操作,但是写操作仍能只可以单线程,如果多线程写(每个线程使用各自的数据库连接)就会出现问题。

两种方案对比

  • 读操作效率上没有什么差别,在读取操作上,理论上并发操作越多方案2效率越高。在实际测试情况下100个线程并发读取,每个线程读取50次,方案一的用时是方案二的2倍多。

关于方案一的具体实现,有两种方式

  • 1、开启一个数据库连接永不关闭,也是so上的大神推荐的做法
  • 2、自己写一个管理类,具体实现见:android Sqlite多线程访问异常解决方案

如何开启wal模式?

  • SQLiteDatabase.enableWriteAheadLogging();

测试代码:https://github.com/alantaorenjie/SQLiteTest.git

参考链接

  • android 多线程数据库读写分析与优化
  • Android使用SQLITE3 WAL模式

SQLite多线程并发操作相关推荐

  1. MYSQL多线程并发操作同一张表同一个字段的更新问题

    MYSQL多线程并发操作同一张表同一个字段的更新问题? 可以用乐观锁方案: 在表里增加个字段,版本号字段 每次更新前先从数据库里获取这个版本号的值,然后更新时要同步更新版本号+1,并且增加更新条件版本 ...

  2. java sqlite 多线程并发_C#_C#解决SQlite并发异常问题的方法(使用读写锁),本文实例讲述了C#解决SQlite并 - phpStudy...

    C#解决SQlite并发异常问题的方法(使用读写锁) 本文实例讲述了C#解决SQlite并发异常问题的方法.分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLI ...

  3. java sqlite 多线程并发_sqlite之多线程总结

    12.android 多线程数据库读写分析与优化 11.多线程操作Sqlite? ==== 最新需要给软件做数据库读写方面的优化,之前无论读写,都是用一个 SQLiteOpenHelper.getWr ...

  4. java 多线程全局变量_JAVA多线程并发操作全局变量

    现在我有一个需求: 用户想发起一个请求,用户必须输入一个Licence Key,然后查看有没有权限访问,并且返回可用数量,然后后台有很多的线程会操作这个变量. 我本来是准备把这个变量存储在表中,根据用 ...

  5. java sqlite 多线程并发_Android中Sqlite数据库多线程并发问题

    最近在做一个Android项目, 为了改善用户体验,把原先必须让用户"等待"的过程改成在新线程中异步执行.但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败. ...

  6. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  7. mysql服务器多线程模型_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码 - 陈彦斌 - 博客园...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  8. java的知识点32——多线程 并发同步的 性能分析、快乐影院  订票操作

    多线程  并发  同步  性能分析 /*** 线程安全: 在并发时保证数据的正确性.效率尽可能高* synchronized* 1.同步方法* 2.同步块* @author Administrator ...

  9. Android 数据库综述(二) 程序计算器与信号量来处理多线程并发问题

    Android 数据库综述(二) 程序计算器与信号量来处理多线程并发问题 多线程操作数据库,为处理并发问题,大家第一想到的是加锁操作 ,SQLite是文件级别的锁.SQLite3对于并发的处理机制是允 ...

最新文章

  1. HTML POST提交参数给PHP并返回json,上传execl文件
  2. new和make的区别
  3. 图片的base64编码实现以及网页上显示
  4. C++ string assign()赋值常用方法
  5. 操作元素之表单属性设置
  6. 三十二 、K8s审计
  7. word页码怎么从第三页开始设置为第一页_如何让页码从指定页开始,而不是第一页?...
  8. Linux笔记17.数据完整性检测工具
  9. SqlBulkCopy(大数据量拷贝)
  10. java中使用阻塞队列实现生产这与消费这之间的关系
  11. 计算机上的无线网络开关怎么打开,联想笔记本无线网络开关怎么打开
  12. python爬虫国家企业信息网_国家企业信用信息公示系统爬虫
  13. 2022高频面试题之css篇
  14. 【机器学习】机器学习泛泛之谈
  15. 计算机桌面输入法怎么恢复,电脑输入法图标不见了怎么办 电脑输入法图标消失找回【图文】...
  16. 葡聚糖-叶酸;Dextran-FA;Dextran-Folicacid 结构式;科研试剂简介
  17. 软件测试 | 常见代理工具
  18. 《编程之美》笔记之——24点游戏
  19. 【语音去噪】基于最小二乘自适应滤波LMS和RLS实现语音去噪含Matlab源码
  20. 空间统计说历史:罗马七丘的空间分析(一)

热门文章

  1. 详解虚拟机下三种联网模式
  2. 基于fs_11c14开发板的项目实践
  3. 用java实现简单的图像处理基础篇之像素点数据的移位计算
  4. JavaScript 05 — Flex Panels
  5. FFmpeg 中的 log 输出到 Android 的 logcat 中
  6. python开发sdk模块
  7. Python123 C编程题答案解析
  8. Cifar-10 数据格式分析
  9. 目标检测算法——工业缺陷数据集汇总1(附下载链接)
  10. 热门同性恋社交网站 看下他们是怎么运营的。