Android SQLite中的多线程怎么样?

Evg*_*acu 11 sqlite multithreading android

在我的应用程序中,我必须实现一些UI和同步服务.它在后台运行并更新数据.同步服务不是很简单,它使用多线程.

所以,这是我的故事:当我开始开发这个应用程序时,我对sqlite一无所知,所以我只是没有在Java中使用任何线程同步.结果:我得到了许多异常,例如"SQLiteException:数据库被锁定:BEGIN EXCLUSIVE;"

然后我将所有事务与常规Java synchronized(){}块同步.一切都好得多了.但我使用Cursors为我的列表实现CursorAdapter.所以,有时我得到相同的"SQLiteException:数据库被锁定:BEGIN EXCLUSIVE;"

我结束了创建一个小线程安全的sqlite实用程序,它处理所有线程安全的东西.另外,我必须使用像ArrayAdapter这样的东西(从Cursor读取所有数据并在读取后关闭它,同时也同步这个块).所以,它运作正常

但是,我不喜欢这种处理UI的方式,因为这个解决方案让UI变得非常慢 - 从光标读取一些数据相当快,但比使用CursorAdapter慢

那么,谁得到了这个问题的解决方案?谢谢

Evg*_*acu 18

所以,终于出来了解决方案.这里是.

我读了一些论坛,谷歌小组,发现sqlite数据库应该只打开一次.所以,我用singleton实现了这个.

此外,我实现了一些db代码来同步所有写操作(以防止许多线程一次执行写操作).我不关心打开游标,从中读取.

经过几天的测试后,我没有收到用户的错误报告,所以我认为这样做有效

在我之前的工作中,我在应用程序中多次打开sqlite数据库,这就是问题所在.


小智 5

SQLite实现了独占写锁,共享读锁模型.这意味着您可以同时在数据库中使用并发读取器或单个写入器,您不能同时拥有这两个读取器.如果使用WAL日志记录功能,则可以在数据库中同时激活单个编写器和多个读取器,但是仍然不能有多个编写器.这里这里有关于SQLite并发的优秀文档.

您可能需要考虑一下Berkeley DB.Berkeley DB提供了与SQLite完全兼容的SQL API.事实上,我们所做的就是在Berkeley DB存储层之上添加SQLite解析器,规划器和执行器.它为SQLite应用程序开发人员提供的是一个SQLite兼容的库,它具有额外的可伸缩性,并发性和可靠性(HA)以及其他功能.Berkeley DB支持多个读取器并同时访问数据库.有两篇优秀的白皮书由Mike Owens撰写,他是"SQLite权威指南"的作者,比较了Berkeley DB和SQLite(性能比较,行为差异).

免责声明:我是Berkeley DB的产品经理之一,所以我有点偏颇.但是像你这样的请求(需要更多的并发性,可扩展性,来自SQLite的可靠性)正是我们决定提供一个组合库,为您提供两全其美的原因.