在我的应用程序中,我在后台线程上使用领域,仅用于写事务,在UI线程上使用领域,以便从同一文件查询。首先,我在后台线程上使用手动事务处理,并注意到有关更改的通知在很长一段时间后到达了UI线程。
数据库不是很大(<1MB),最多只有几千个对象。在有问题的事务中,我迭代了许多对象,但仅更改了其中几个对象的值(〜4个对象实例的某些原始值已更改)。通常,从beginTransaction到commitTransaction之后的日志之间的持续时间大约为100毫秒,但是到UI线程的通知会在1到20秒后到达(对我来说,延迟似乎是随机的,每个事务中的更改几乎相同,但是延迟更改..)。
在后台线程上的commitTransaction完成之后,我尝试在UI线程上调用realm.refresh()。有点帮助,延迟时间较短,但是视觉悬挂几秒钟当然是可怕的。为了进行测试,我将实现更改为具有onSuccess回调的executeTransactionAsync,其行为相同,在事务块完成后的很长一段时间内调用了onSuccess。
我尝试了简单的性能分析,在延迟期间完全使用了后台线程,但我没有安排任何工作,看来领域正在使用它。
所以我的问题是,在commitTransaction()之后直到发布通知之前,领域在做什么?是什么原因导致这么长的时间对DB进行较小的更改?是否有一些最佳方法可以使其保持快速运行? UI线程上打开的realmInstances是否会引起瓶颈(每个片段都可以打开一个查询+通知侦听器,同时在屏幕上显示更多的片段)?
//编辑: 数据几乎是树形的。从根本上讲,A类的实例很少, 它几乎没有原始属性和RealmList(列表长度<1000)。 B类具有大约30个原始属性(包括Strings)和RealmList(长度<5)。 C类具有大约40个原始属性(包括字符串),一些RealmLists和一些指向其他RealmClasses的指针。 在有问题的交易中,我需要更改C的单个实例。
//通过更新我的架构以在所有双向关系上使用反向链接解决了,现在速度很快。从5s到200ms。
答案 0 :(得分:0)
通常从Realm-Java 3.0.0开始,关于模式设计的建议有所变化。
以前,如果您想从子级访问父级,并且要从父级访问子级,则需要具有以下架构:
class A extends RealmObject {
private RealmList<B> children;
class B extends RealmObject {
private RealmList<A> parents;
但是自Realm 3.5.0(又称为引入反向链接的查询)以来,建议是这样的:
class A extends RealmObject {
private RealmList<B> children;
class B extends RealmObject {
@LinkingObjects("children")
private final RealmResults<A> parents = null;
因为双向链接可能导致对象存储的差异运行的时间异常长。
如果没有看到您的架构,那是您最好的选择。