Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite连接和;锁定_Android_Sqlite_Locking - Fatal编程技术网

Android SQLite连接和;锁定

Android SQLite连接和;锁定,android,sqlite,locking,Android,Sqlite,Locking,我想从两个不同的线程访问SQLite数据库,从而使用两个不同的数据库连接。这两个线程将主要从数据库执行读取,并且仅偶尔写入数据库。如果我觉得两个线程都不可能同时向DB写入数据,那么在这种情况下我是否应该感到安全,因为我不应该有任何问题?SQLite显然不是线程安全的,因此如果这样做,您可能会看到数据损坏 使用互斥锁来确保两个线程不能同时访问数据库,或者花费数小时来跟踪虚拟数据损坏错误,这些错误很少发生,而且很难重现 SQLite是线程安全的,使用最新版本,您可以在线程之间共享单个连接。也就是说,

我想从两个不同的线程访问SQLite数据库,从而使用两个不同的数据库连接。这两个线程将主要从数据库执行读取,并且仅偶尔写入数据库。如果我觉得两个线程都不可能同时向DB写入数据,那么在这种情况下我是否应该感到安全,因为我不应该有任何问题?

SQLite显然不是线程安全的,因此如果这样做,您可能会看到数据损坏

使用互斥锁来确保两个线程不能同时访问数据库,或者花费数小时来跟踪虚拟数据损坏错误,这些错误很少发生,而且很难重现


SQLite是线程安全的,使用最新版本,您可以在线程之间共享单个连接。也就是说,SQLite FAQ声明“线程是邪恶的”(我不认为它们在SQLite上下文中是这个意思,而是作为一个一般性的声明)


SQLite具有锁定机制,因此,即使第二个实例尝试在数据库上获取写锁,它也将排队,直到现有锁完成,因此,即使两个线程都在写入SQLite,也应该为您提供支持。常见问题解答表明,由于文件系统中的锁定实施不当,在网络文件系统上使用来自不同进程的多个连接通常是不安全的,但我认为该警告不适用于您的使用。

不太正确。请看我在这里的长篇回复:

您不会损坏数据库,但是如果两个不同的线程、两个不同的连接试图同时写入数据库,您将遇到问题。一个人会“输”。他们不会等待有序运行。如果调用“insert”而不是“insertOrThrow”,您甚至不会得到异常。你就是不给数据库写信

以下是Sqlite在Android中的工作原理。每个SqliteOpenHelper实例都有一个到数据库的连接。调用“getRead/WriteableDatabase”多少次并不重要。一个助手,一个连接。另外,androidsqlite连接代码实现了它自己的线程锁定,因此如果您使用相同的SqliteOpenHelper,并且扩展为相同的连接,那么就可以了

但是,如果您使用了多个助手,那么您的情况可能会很糟糕

我怀疑你可能有多个线程在读,一个线程在写,结果还可以,但我还没有测试过这个

您是否使用多线程来提高写入性能?如果是这样,我建议您只需优化“事务”的使用。如果您进行多个独立写入,则速度非常慢。如果你把它们都打包成一批,速度会非常快(相对而言)。我怀疑这是因为每次独立写入时,Android都会刷新磁盘(速度非常慢)。如果你把它们放在一起,所有的更改都是在一次写入中完成的

关于维护1个helper实例,下面是我最近的一篇博客文章:

作为我早期实现OrmLite Android端口的一部分,我已经编写了一些相当复杂的引用计数逻辑,但我认为在这一点上并不完全必要

为了链接的完整性,我在博客中发布了关于sqlite锁定和多个连接的文章:


来自文档():SQLite是线程安全的。那些链接现在已经死了,你能发布当前的链接吗,我真的很有兴趣阅读这些链接。谢谢你说得对。我需要四处挖掘看看我有没有。如果它们存在,它们将在下面,但我认为,在一个连接中,不会有任何对数据库的并发请求,而在@DrakeAmara的情况下,如果他有单独的连接,那将是非常好的,因为这将意味着对数据库的并发访问