【问题标题】:Sqlite deadlock issueSqlite 死锁问题
【发布时间】:2014-10-15 14:15:58
【问题描述】:

从 Web 服务收到的响应我正在后台线程中将其写入数据库。 同时我正在执行其他数据库操作,因为该应用程序面临死锁,正如here 所解释的那样。 如链接中所述,有两种可能的方法

  • 不要让写入线程加入读取线程。正如here 所提到的,我正在尝试以在执行数据库操作时不会发生死锁的方式使用 java 线程。我已经使用同步块来实现这一点,但它没有帮助。

  • 我没有使用第二种方法,因为它有丢失数据的风险。

我应该如何解决这个问题?

【问题讨论】:

  • 可能跟安卓有关,但是链接的文章意义不大。如果只有一个连接并且两个线程共享它,那么读取线程应该使用写入线程的事务,因此不应阻塞。

标签: android multithreading sqlite


【解决方案1】:

问题是因为我通过我的应用程序使用相同的数据库对象。 虽然我使用同步方法来访问数据库并执行数据库操作,但数据库对象是相同的。

假设我有三个同步方法getdatabase()writedb()readdb(),它们分别返回数据库对象、写入数据库和读取数据库。 我有两个线程 T1 和 T2。

  1. 在线程 T1 中调用 getdabase()
  2. 使用线程 T1 开始写入数据库。
  3. 使用线程T2调用getdabase()(T1没有使用这个方法,访问会被屏蔽)
  4. 使用线程 T2 调用 readdb()。 --死锁

为了避免这个问题,我使用了应用程序变量(应用程序类中的静态变量),只有在没有其他线程使用数据库时才会授予对数据库的访问权限。

【讨论】:

  • 我也遇到了死锁问题。至于我已经读过的内容,获取可写/可读数据库的方法返回相同的对象,例如即使它是从getReadableDb() 返回的对象,您仍然可以写入数据库。也许是这样。
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 2011-03-28
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2019-10-18
  • 2015-03-29
相关资源
最近更新 更多