【问题标题】:About android Sqlite safety in multi-process case关于android Sqlite在多进程情况下的安全性
【发布时间】:2022-05-11 15:26:04
【问题描述】:

在我的应用程序中,存在多个进程,并且在每个进程中,我需要访问同一个 SQLite 数据库(当然,这意味着超过 2 个线程),所以我担心的不仅仅是线程安全SQLite,还有过程安全。

这种情况的一个解决方案是using content-provider。但来自 android sdk,it warns that its methods may be called from multiple threads and therefore must be thread-safe。如果内容提供者本身不一定意味着线程安全,我怎么能假设它是进程安全的?

article 还阐明了 SQLiteDatabase 本身默认是同步的,从而保证不会有两个线程同时接触它。如果在多进程情况下怎么办?两个进程可以同时修改同一张表吗?会崩溃吗?

【问题讨论】:

  • 不,他们不能。你会得到 SQLiteDatabaseLockedException
  • @mianlaoshu 你找到解决这个问题的办法了吗?

标签: android sqlite


【解决方案1】:

多个进程的行为就像多个线程一样,即它们的事务是安全的,不会相互干扰。

【讨论】:

  • 但是通过这两个进程,我实际上可以获得 2 个 SQLiteDatabase 实例,这会不会导致线程或进程安全的任何潜在问题?
  • 不同的进程有不同的地址空间;这两个物体甚至看不到对方。 (他们只看到数据库文件上的锁。)
  • 是的,我知道。所以这意味着,SQLite 数据库锁应该是整个系统的全局锁,如果一个应用程序获得了锁,那么另一个进程中的任何其他应用程序在访问数据库时都应该获得“锁定”状态,对吧?
  • 我刚刚在 2.3 设备上运行了一个简单的测试。如果没有内容提供程序,它会崩溃(数据库是锁定异常),否则它运行良好。但在 6.0 设备上两者都可以工作。不知道为什么。有什么想法吗?
  • @Wayne 较新的平台被实现为在看到锁时等待。但它不会等待超过 2.5 秒。如果数据库在 2.5 秒后仍处于锁定状态,则抛出 'database is locked' 异常。
【解决方案2】:

您可以在这里找到答案:https://www.sqlite.org/faq.html(第 5 点)。简要说明:

多个进程可以同时打开同一个数据库。多 进程可以同时执行 SELECT。但是只有一个过程可以 但是,可以随时更改数据库。

【讨论】:

    【解决方案3】:

    如果您使用 Android Room,请参阅https://issuetracker.google.com/issues/62334005

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      相关资源
      最近更新 更多