SQLite连接和锁定

Dra*_*ara 8 sqlite android locking

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

Kev*_*gan 9

不太对劲.请看我在这里的长篇回复:

Android上SQLite的最佳做法是什么?

您不会损坏您的数据库,但如果两个不同的线程(具有两个不同的连接)尝试同时写入数据库,则会出现问题.一个人会"输".他们不会等待按顺序运行.如果你调用'insert'而不是'insertOrThrow',你甚至不会得到异常.你只是不会写入数据库.

以下是Android中Sqlite的工作原理.每个SqliteOpenHelper实例都有1个与数据库的连接.你调用'getRead/WriteableDatabase'多少次并不重要.一个帮手,一个连接.此外,Android sqlite连接代码实现了自己的线程锁定,所以如果你使用相同的SqliteOpenHelper,并通过扩展,相同的连接,你会没事的.

但是,如果您使用多个帮助程序,则可能会出现问题.

我怀疑你可以有多个线程读取,1个写入,然后出来确定,但我没有测试过这个.

您是否使用多线程进行写入性能?如果是这样,我建议只是优化你对"交易"的使用.如果你进行多次独立写入,它的速度非常慢.如果你将它们全部包装成一批,它的速度非常快(相对).我怀疑这是因为每次独立写入,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


Lar*_*tig 6

SQLite是线程安全的,使用最新版本,您可以在线程之间共享单个连接.也就是说,SQLite FAQ指出"线程是邪恶的"(我不认为它们在SQLite的上下文中意味着它,但作为一般性陈述).

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