【问题标题】:Android: multiple threads writing on SQLite databaseAndroid:多线程写入 SQLite 数据库
【发布时间】:2013-04-30 14:06:58
【问题描述】:

在我的主要活动的onCreate() 方法中,我调用了我的dbManager 的构造函数,我调用了创建SQLiteOpenHelper 实例的open 函数,然后我调用了getWritableDatabase()。 在 UIThread 中,我将记录添加到数据库并将这些记录保存到 ArrayList。另外两个线程检查 ArrayList 做的事情,然后更新列表和数据库。 现在我想在 UI 中添加一个按钮来使用AsyncTask 删除数据库和列表记录。 我读过SqliteOpenHelper 对象在一个数据库连接上。因此,如果有一个助手实例,则只有一个数据库连接。此连接可用于多个线程,并且 SqliteDatabase 对象使用 java 锁来保持访问序列化。那么如果我有多个线程在数据库上写,一个线程会一直等到前一个线程完成他的操作?
添加新功能(全部删除)可能会产生问题,因为我必须避免两个线程之一可能会尝试编辑不再存在的记录。我怎样才能实现我的目标?谢谢。

【问题讨论】:

  • 你应该实现消费者和生产者模式,它会帮助你建立一个请求队列,不要并行写入数据库。
  • 取决于你如何实现你的编辑,但是一个sql更新返回n,其中n是修改的项目数,如果不存在与where子句匹配的记录,则完全可以为0。
  • 1) 你不应该在 UI 线程上进行数据库操作。 2) 只有一个线程读取/写入 ArrayList。 @IamStalker 为什么不并行写入数据库?
  • 因为你必须照顾乐观并发,那是因为 SQL-lite 不支持并发。
  • 是的,sqlite本身不支持并发,但是Android的SQLiteOpenHelper却完美支持并发。您只需要确保所有线程都使用同一个实例!

标签: android multithreading sqlite


【解决方案1】:

数据库:

只要您只使用一个助手,您就可以实现线程安全,无需执行任何操作。
在多线程应用程序中,您仅在创建助手时才需要synchronized。 如果你想定义一个临界区(多个原子操作),你可以使用transacion
getWritableDatabase()close(false) 包装每个电话:

public void doSomething() {
    SQLiteDatabase tdb = getWritableDatabase();
    dbInstance.writeSomething(tdb, 1);
    close(false);
}

这样我就有多个线程读写数据库没有任何问题。

你的应用逻辑:

使用内存来跟踪对象状态,并且仅将数据库用作存储。因此,如果一个线程从数据库中删除行 - 您可以立即更新内存中的对象,并相应地处理您的用户界面。
如果您的数据非常大,那么您只能在内存中保留一个 SparseArray 的脏行 ID。
在这里同步一些操作可能很有用。

【讨论】:

  • 数据库助手正在执行维护数据库完整性所需的所有同步。并且与 db 无关 - 在应用程序逻辑中,开发人员可能需要围绕代码中的关键部分进行同步以保持业务逻辑的完整性。
  • 没有这个限制,一百个线程可以一起读写同一个数据库,没有任何问题。使用一个助手。这不是编写多线程应用程序时的问题所在。
  • 另见stackoverflow.com/questions/2493331/… - 他说的和我说的一模一样:使用一个辅助实例,多线程应用程序就可以了
  • 老兄!你错过了整个事情,它是一个提供者消费者队列,没什么好说的。
【解决方案2】:

所以如果我有多个线程在数据库上写入,一个线程将 等上一个完成他的操作?

不必如此。有关详细信息,请参阅this。无论如何,这取决于数据库引擎,并且应该是透明的。

添加新功能(全部删除)可能会产生问题, 因为我必须避免两个线程之一可能会尝试编辑 不再存在的记录。我怎样才能实现我的目标?

只有一个线程更新数据库。其他线程只修改ArrayList——还要注意ArrayList不是线程安全的,考虑使用Collections#synchronizedList()

【讨论】:

    猜你喜欢
    • 2015-10-26
    • 2013-12-24
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多