我想从2个不同的线程访问SQLite数据库,从而使用2个不同的连接到数据库。这两个线程将主要执行从数据库中读取数据,并且仅偶尔写入数据库。如果我觉得这两个线程同时针对数据库写入数据的可能性,我应该感到安全吗?在这种情况下,我不应该有任何问题?SQLite连接和锁定
回答
SQLite是线程安全的,最近的版本中,你可以线程之间共享一个连接。也就是说,SQLite FAQ指出“线程是邪恶的”(我不认为它们是指SQLite中的这种情况,而是一般性声明)。
SQLite具有锁定机制,因此即使第二个实例试图获取数据库上的写入锁定,它也会排队等待现有锁定完成,因此即使两个线程正在编写SQLite也应该适应您。常见问题表明,使用不同进程的多个连接对网络文件系统通常是不安全的,因为在文件系统中执行的锁定效果不佳,但我认为该警告不适用于您的使用。
SQLite显式不是线程安全的,因此如果你这样做,你可以预期数据损坏。
使用互斥锁确保两个线程无法同时访问数据库,或花费数小时试图追踪很少发生且难以重现的幻影数据损坏错误。
从文档(http://www.sqlite.org/faq.html# q6):** SQLite是线程安全的** –
不完全正确。请在这里看到我的长回复:
What are the best practices for SQLite on Android?
你不会损坏你的数据库,但如果两个不同的线程,有两个不同的连接方式,试图在同一时间写的分贝,你将有问题。一个会“失去”。他们不会等待按顺序运行。如果你调用'insert'而不是'insertOrThrow',你甚至不会得到异常。你只是不会写入数据库。
以下是Android中的Sqlite的工作原理。每个SqliteOpenHelper实例都有1个到数据库的连接。无论您多次调用“getRead/WriteableDatabase”,都无关紧要。一个帮手,一个连接。另外,Android的sqlite连接代码实现了自己的线程锁定,所以如果你使用相同的SqliteOpenHelper,并通过扩展,相同的连接,你会没事的。
但是,如果您使用多个助手,则可能会出现问题。
我怀疑你可以有多个线程阅读,1个写作,出来OK,但我没有测试过这个。
您是否使用多个线程来提高写入性能?如果是这样,我会建议简单地优化您对“交易”的使用。如果你做了多个独立写入,它非常慢。如果你把它们全部包装在一起,它非常快(相对)。我怀疑这是因为每次独立写入时,Android刷新到磁盘(这是非常缓慢的)。如果你在一堆中做了这些改变,所有改变都是在1次写入中完成的。
至于保持1个帮助程序实例,这里是我的一个最近的一篇博客看:
http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection
我写了一些相当复杂的引用计数的逻辑,我早落实OrmLite的Android端口的一部分,但在这一点上我不认为这是完全必要的。
http://touchlabblog.tumblr.com/post/24474455802/ormlite-for-android
对于链路完整性,我的博客帖子大约sqlite的锁定和多个连接:
http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking
- 1. sqlite数据库连接/锁定问题
- 2. SQLite文件锁定和DropBox
- 3. Sqlite DB锁定
- 4. SQLite保持数据库锁定,即使连接关闭后
- 5. 尽管连接已关闭,SQLite锁定文件
- 6. Java中的SQLite连接池 - 锁定数据库
- 7. MySQL InnoDB锁定连接行
- 8. sqlite的敲定和Db锁定问题
- 9. SQLite和iPad连接没做
- 10. Android,SQLite连接和事务
- 11. DBConnection连接到SQLite和MySQL
- 12. 等效连接postgres和sqlite
- 13. 如何连接SQLite和Java?
- 14. 连接到套接字锁定UI
- 15. TransactionScope和SQLite数据库被锁定
- 16. SQLAlchemy和SQLite:数据库被锁定
- 17. 用SQLite和C“数据库被锁定”#
- 18. 接受“数据库被锁定”错误使用SQLite和C#
- 19. android Sqlite连接
- 20. SQLite连接池
- 21. 连接到SQLite
- 22. 用SQLite锁定一行(读锁?)
- 23. 在sqlite中锁定SQLite数据库admin
- 24. SQLite数据库被锁定
- 25. Java - 锁定SQLite数据库
- 26. sqlite的MPI锁定(python)
- 27. SSIS是否执行连接锁定?
- 28. 使用连接时锁定MySQL
- 29. 使用SQlite JDBC库在Java/Scala中使用独占锁来打开Sqlite连接
- 30. 浏览,连接,锁和ORDER BY
谢谢... FAQ是一个很好的资源 –
但我想一个连接将不会有任何并发请求数据库,而在@DrakeAmara的情况下,这将是伟大的,如果他有单独的连接,因为这意味着并发访问数据库 – user1530779