Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.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
Java 在SQLite中长时间打开读取事务可以吗?_Java_Android_Multithreading_Sqlite_Transactions - Fatal编程技术网

Java 在SQLite中长时间打开读取事务可以吗?

Java 在SQLite中长时间打开读取事务可以吗?,java,android,multithreading,sqlite,transactions,Java,Android,Multithreading,Sqlite,Transactions,读取事务: 我们假设WAL是启用的,这样我们可以在一个踏板上阅读,而另一个踏板正在写入 我想要达到的是这样的目标 我有两个线程,一个是UI线程,有时执行db读,另一个是db线程,在事务中执行db读/写 UI线程中的结果是缓存的,有时有不完整的信息,比如对于一个列表,我们只查询列表的大小,或者只查询该查询的前10项,然后当UI到达该部分时,我们以增量方式加载更多信息 在db线程上,我们将执行事务并记住所有更改,然后将更改发布到UI线程(UI线程是一个循环线程),并增量更新UI缓存,以便尽可能少地

读取事务:

我们假设WAL是启用的,这样我们可以在一个踏板上阅读,而另一个踏板正在写入


我想要达到的是这样的目标

我有两个线程,一个是UI线程,有时执行db读,另一个是db线程,在事务中执行db读/写

UI线程中的结果是缓存的,有时有不完整的信息,比如对于一个列表,我们只查询列表的大小,或者只查询该查询的前10项,然后当UI到达该部分时,我们以增量方式加载更多信息

在db线程上,我们将执行事务并记住所有更改,然后将更改发布到UI线程(UI线程是一个循环线程),并增量更新UI缓存,以便尽可能少地阻止UI线程

问题是,当db事务完成时,UI线程可能会在looper线程处理该消息之前触发UI线程上的db read,同时由于UI框架的某些限制,我们无法更新缓存,因为UI线程当前正在使用它

所以我的想法是在UI线程上,在任何查询发生之前,开始一个读取事务(在延迟模式下开始一个事务,该事务不会锁定数据库,因为没有写入),然后在UI线程中发生的任何读取将在该事务中发生,然后looper线程获得更新信息,结束事务,和更新缓存,然后开始另一个缓存。因此,数据库和缓存将在UI线程中转换为新状态,并进行同步



因此,我可以让读取事务长时间处于打开状态吗?

所有读取都是在一个事务中完成的(如果需要,是自动读取),并且所有事务都会锁定数据库。但是,WAL模式中的只读锁仅阻止

只要不断增长的WAL文件不会溢出磁盘,长时间处于活动状态的事务就没有问题。
如果您的应用程序需要事务处理才能正常运行,那么您别无选择——另一种选择是手动实现类似的事务处理机制,最好让数据库来处理。

可能不行。但可以肯定的是,你必须测量。