首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveAndroid.beginTransaction()和多线程

ActiveAndroid.beginTransaction()和多线程
EN

Stack Overflow用户
提问于 2016-03-04 13:02:32
回答 1查看 684关注 0票数 0

我想使用activeAndroid以多线程方式存储在sqlite中的几个列表。我为每个列表运行一个线程以使其持久。

每个线程的主体看起来都是这样的。

代码语言:javascript
复制
ActiveAndroid.beginTransaction();
try {
   for (MyObjToPersist e : myListOfObjToPersist){
        e.save();
   }
   ActiveAndroid.setTransactionSuccessful();
}
finally {
   ActiveAndroid.endTransaction();
}

事务似乎向db添加了一个锁,因为每个线程都一个接一个地运行。

如果不使用事务,事情就会像预期的那样工作,但是任务非常慢(一百次最慢)。

本课题讨论的是这里

有人知道如何避免这种行为吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-04 13:26:44

TL;DR:只有一个线程可以进行修改,但是所有线程都可以读取数据。

Can multiple applications or multiple instances of the same application access a single database file at the same time? 多个进程可以同时打开同一个数据库。多个进程可以同时进行选择。但是,只有一个进程可以在任何时候对数据库进行更改。 SQLite使用读取器/写入器锁来控制对数据库的访问。(在缺乏对读取器/写入器锁的支持的Win95 95/98/ME下,使用的是概率模拟。)但请注意:如果数据库文件保存在NFS文件系统上,则此锁定机制可能无法正常工作。这是因为fcntl()文件锁定在许多NFS实现上中断。如果多个进程可能试图同时访问该文件,则应避免将SQLite数据库文件放在NFS上。在Windows上,微软的文档说,如果您没有运行Share.exe守护进程,那么锁在胖文件系统下可能无法工作。对Windows有丰富经验的人告诉我,网络文件的文件锁定是非常错误的,而且不可靠。如果他们说的是真的,那么在两台或多台Windows计算机之间共享一个SQLite数据库可能会导致意想不到的问题。 我们知道没有其他嵌入式SQL数据库引擎像SQLite那样支持并发性。SQLite允许多个进程同时打开数据库文件,并允许多个进程同时读取数据库。当任何进程想要写入时,它必须在更新期间锁定整个数据库文件。但这通常只需要几毫秒。其他流程只需等待作者完成,然后继续他们的业务。其他嵌入式SQL数据库引擎通常只允许一个进程同时连接到数据库。 但是,客户机/服务器数据库引擎(如PostgreSQL、MySQL或Oracle)通常支持更高级别的并发性,并允许同时向同一数据库写入多个进程。这在客户机/服务器数据库中是可能的,因为始终有一个控制良好的服务器进程可用于协调访问。如果您的应用程序需要大量并发性,那么您应该考虑使用客户机/服务器数据库。但经验表明,大多数应用程序所需的并发性比它们的设计者想象的要少得多。当SQLite试图访问另一个进程锁定的文件时,默认行为是返回SQLITE_BUSY。您可以使用sqlite3_busy_handler()或sqlite3_busy_timeout() API函数从C代码中调整这种行为。

https://www.sqlite.org/faq.html#q5

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35796792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档