Java 在SQLite中长时间打开读取事务可以吗?
读取事务: 我们假设WAL是启用的,这样我们可以在一个踏板上阅读,而另一个踏板正在写入Java 在SQLite中长时间打开读取事务可以吗?,java,android,multithreading,sqlite,transactions,Java,Android,Multithreading,Sqlite,Transactions,读取事务: 我们假设WAL是启用的,这样我们可以在一个踏板上阅读,而另一个踏板正在写入 我想要达到的是这样的目标 我有两个线程,一个是UI线程,有时执行db读,另一个是db线程,在事务中执行db读/写 UI线程中的结果是缓存的,有时有不完整的信息,比如对于一个列表,我们只查询列表的大小,或者只查询该查询的前10项,然后当UI到达该部分时,我们以增量方式加载更多信息 在db线程上,我们将执行事务并记住所有更改,然后将更改发布到UI线程(UI线程是一个循环线程),并增量更新UI缓存,以便尽可能少地
我想要达到的是这样的目标 我有两个线程,一个是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文件不会溢出磁盘,长时间处于活动状态的事务就没有问题。
如果您的应用程序需要事务处理才能正常运行,那么您别无选择——另一种选择是手动实现类似的事务处理机制,最好让数据库来处理。可能不行。但可以肯定的是,你必须测量。