【问题标题】:Database handling with 2 processes使用 2 个进程处理数据库
【发布时间】:2011-07-12 00:33:55
【问题描述】:

我有一个包含 2 个部分的应用程序。

  • 创建内容的服务。
  • 使用内容的应用程序

每个都作为不同的进程运行。问题是它们都共享一个数据库。而且我经常遇到数据库锁定错误,无论是在服务尝试写入内容还是 UI 正在读取数据时。反之亦然。 怎么办?

  • 用于访问 DB 的类是单例类。但是由于 UI 和服务都是 2 个不同的进程,所以我认为有 2 个单例。所以这没有帮助。
  • 我想即使synchronise 也无济于事,因为这又是因为两个不同的进程。
  • Content Providers 可能是一个选项,但由于我使用复杂的查询来挖掘信息,因此也很难使用它。

如何让两个进程共享数据库。 任何线索将不胜感激。

【问题讨论】:

  • 你能指导我如何使用 berkeley db。
  • 你找到解决这个问题的方法了吗?

标签: android database sqlite android-contentprovider synchronize


【解决方案1】:

以下是一篇很棒的文章,介绍了如何在 Android 上使用 SQLite 进行锁定以及需要注意的事项:http://kagii.squarespace.com/journal/2010/9/10/android-sqlite-locking.html

我想你会在那里找到一些答案:)

【讨论】:

  • 我的问题不同。我有 2 个进程(相当于 2 个应用程序)试图访问同一个数据库,并且它们相互锁定。
【解决方案2】:

每次操作后关闭连接

捕获数据库锁定错误并尝试在 50 毫秒后重新连接

或者让服务处理数据库,活动向服务请求数据

可能有 isDatabaseInUseMethod 吗?

【讨论】:

  • 好吧,我知道没有isDatabaseInUse 或类似的东西。而且由于Service和Activity是不同的进程,它们之间的Procedure调用并不容易。
  • 是的,但您仍然可以捕获异常并重复查询。围绕它做一个while语句。它将在另一个进程关闭其连接时立即执行。在两者中进行相同的操作,它们将切换连接
  • -1。这里有很多问题。这本质上是试图忽略像互斥锁这样的东西被发明来解决的问题。不能保证一个进程会以任何合理的速度放手,例外应该是......例外,而不是规则,轮询通常是要避免的。请对实际解决方案进行一些研究。
【解决方案3】:

您应该使用内容提供者通过一个来源汇集您的数据库查询。在内容提供者内部,您可以使用任何您希望确保没有并发访问的锁定机制。您还可以考虑使用内容观察器来协调服务操作和数据库更改。

【讨论】:

  • 我确实挖掘了这些行。无法在 ContentProviders 上获得一个示例应用程序。另外,我们可以不用ContentObservers吗?
  • 是的,你可以在没有 contentobservers 的情况下使用它。观察者只是处理通知更改,但您必须手动触发它们,因此如果您愿意,可以忽略它们。
【解决方案4】:

使用内容提供商是一种选择。另一个是看看Berkeley DB。 BDB SQL API 与 SQLite 兼容,BDB 锁管理器允许多个线程和/或进程同时读取/写入数据库。

【讨论】:

  • 听起来很有趣。我一直在挖掘这方面的一些信息。有 2 个选项 BDB 和 BDB SQL,我显然对后者感兴趣。但是看起来我们需要为 SQL 版本构建源并刷新 ROM?
  • OTN 论坛是一个很好的起点:bit.ly/eIREhr 是的,我相信您需要构建源代码。我已经请人在 OTN 论坛上跟进您的问题。
猜你喜欢
  • 2013-04-28
  • 2021-10-08
  • 2011-01-02
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多