android - android中带有房间数据库的多线程
问题描述
最近我开始在我的 android 应用程序中使用房间数据库。尝试从多个线程访问数据库时遇到一些问题。我在所有线程中使用相同的数据库实例。
- 据我所知,如果所有线程都具有相同的数据库实例,则数据库访问将被序列化。我在一篇博客中读到,在序列化模式下,只有一个线程可以在数据库中读写。然而,根据sqlite文档,读取启用共享锁,因此多个线程可以同时读取。那么当使用单个数据库实例时,是否遵循允许多次读取和一次写入操作的sqlite默认锁定标准?
- 根据 sqlite 文档,在写入数据库时,首先启用保留锁,如果任何其他写入操作尝试获取保留锁,则写入尝试失败并且 db 返回 SQLITE_BUSY。但是,如果我试图从不同的线程运行两个写操作,我永远不会收到这个错误。这是否意味着写入操作已排队并且保证我们永远不会出现 SQLITE_BUSY 错误,因此写入操作永远不会失败?
- 我正在一个线程(Thread1)中执行长插入操作(@Insert)并在另一个线程(Thread2)中读取数据库。如果我在 Thread1 之后启动 Thread2,则读取操作不会返回 Thread1 中新插入的数据,因此读取发生在插入之前。是否发生这种情况是因为最初写入启用了保留锁,并且在此期间可以获取新的共享锁@sqlite docs。
抱歉问了一个很长的问题。
解决方案
推荐阅读
- xcode - 'UIApplicationExitsOnSuspend'
- matlab - 如何在 Matlab 中测量这些黑色区域
- node.js - JSON.parse 正在从 Google Books API 创建空/未定义的对象。无法在 NodeJS 中迭代
- java - Android Studio 中的响应式视图
- postgresql - 从存储过程中获取标识
- c# - 通过 topshelf (.net core 2.2) 使用 hangfire 作为 Windows 服务
- ios - 如何在应用程序主包中设置另一个 Info.plist 而不是主 Info.plist 文件(对于一些次要属性)?
- ruby-on-rails - 如何在cmder中修复'make failedNo such file or directory'
- spring - Spring security antMatcher 未按预期工作
- recursion - 从 Groovy 或 Java 中的复杂数据结构中删除空值