前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android数据库多线程并发操作异常

Android数据库多线程并发操作异常

作者头像
静默加载
发布2020-05-29 11:20:04
1.8K0
发布2020-05-29 11:20:04
举报
文章被收录于专栏:振兴的Android修炼手册

在我们做项目的过程中经常会有多线程异步处理的情况,那么Android中多线程操作数据我们一般会遇到什么样的问题?

多个数据库对象执行并发

指由不同的SQLiteOpenHelper打开的相同数据库对象,默认enableWriteAheadLogging=false

多线程

单进程和多进程结果一样。

  • 同时进行数据库的读操作不会产生任何问题;
  • 如果都需要创建表,那么多次创建可能会出现问题;
代码语言:javascript
复制
android.database.sqlite.SQLiteException:table key_value_alerady exits (code 1)
  • 如果表已经创建,那么同时进行读写操作;
代码语言:javascript
复制
14:48:41.039#[androidcode@]#29329#E#SQLiteDatabase #Error inserting TITLE=1572590918524
android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)

因为Android的数据库默认配置是不支持多个多线程读写的,enableWriteAheadLogging=true 可以进行多线程的读写。

一个数据库对象执行并发

多线程操作问题:已经打开的数据库在进行读写的时候被其他地方调用了close关闭了数据库。

代码语言:javascript
复制
java.lang.IllegalStateException: attempt to re-open an already-closed object

同一个SQLiteOpenHelper实例获取的database是相同的,多在线程的情况下应该进行统一的openclose,所以一般都通过单例去管理database 的打开和关闭。

数据库连接池

如果 SQLiteOpenHelper 使用的是单例,SQLiteDatabaseCRUD 操作都是从同一个连接池中获取连接. 默认情况下, 连接池中只有一条主连接, 所以同一时间只能进行一项操作,多线程读写几乎是无用功;

enableWriteAheadLogging()方法可以使得多链接并发查询可行,但默认没有开启该功能, 该方法会根据配置在连接池中创建多条连接;

为什么Android数据库链接池默认只有一条链接,请阅读 Android中的数据库连接池 这篇文章~!

文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多个数据库对象执行并发
    • 多线程
      • 一个数据库对象执行并发
      • 数据库连接池
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档