使用2个进程处理数据库

24

我有一个应用程序,其中包含2个部分:

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

这两者都作为不同的进程运行。问题是它们共享一个数据库,当服务尝试写入数据并且UI正在读取数据时,经常会出现数据库锁定错误,反之亦然。 如何解决这个问题呢?

  • 用于访问数据库的类是单例类。但由于UI和服务是2个不同的进程,我想有2个单例类,因此这并没有帮助。
  • 即使使用synchronize关键字,也不会有所帮助,因为这还是因为有2个不同的进程。
  • 内容提供者(Content Providers)可能是一种选择,但由于我使用复杂的查询来获取信息,使用它可能非常困难。

如何让这两个进程共享数据库? 非常感谢您提供任何线索。


你能指导我如何使用Berkeley DB吗? - Kishore
你找到这个问题的解决方案了吗? - Mateen Chaudhry
4个回答

8

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


听起来很有趣。我已经在查找一些相关信息了。有两个选项BDB和BDB SQL,我显然对后者感兴趣。但看起来我们需要构建源代码并刷写ROM才能使用SQL版本? - Codevalley
OTN论坛是一个很好的起点:http://bit.ly/eIREhr 是的,我相信你需要构建源代码。我已经请人在OTN论坛上跟进你的问题了。 - dsegleau

3

每次操作后关闭连接

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

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

也许有isDatabaseInUseMethod?


当然,在我所知道的范围内,没有isDatabaseInUse或类似的函数。由于Service和Activity是不同的进程,它们之间的过程调用并不容易。 - Codevalley
3
是的,但您仍然可以捕获异常并重复查询。在其周围加上 while 语句。它将在其他进程关闭其连接后立即执行。在两者中都做相同的操作,它们将切换连接。 - sherif
这里有很多问题。本质上,它试图忽略像互斥锁这样的东西被发明来解决的问题。不能保证一个进程会以任何合理的速率释放资源,异常应该是例外而不是规则,并且通常应该避免轮询。请对实际解决方案进行一些研究。 - Bondolin

1
你应该使用内容提供程序来将数据库查询集中到一个源中。在内容提供程序内部,您可以使用任何锁定机制来确保您不会同时访问。您还可以考虑使用内容观察器来协调服务操作与数据库更改。

我已经在这些方面进行了研究。无法找到一个关于“ContentProviders”的示例应用程序。另外,我们能否在没有“ContentObservers”的情况下使用它? - Codevalley
是的,您可以在没有ContentObservers的情况下使用它。观察者只处理通知更改,但您必须手动触发它们,因此如果您想要,可以忽略它们。 - Brian Griffey

0

1
我的问题与众不同。我有两个进程(相当于两个应用程序)尝试访问同一个数据库,它们会互相锁定。 - Codevalley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接