我在我的App中使用greenDA作为本地数据库来存储父子关系(简化示例)。
@Entity
class ParentDB {
@Id
@Unique
@NotNull
private String id;
@ToMany(referencedJoinProperty = "parentId")
private List<ChildDB> children;
...
}
@Entity
class ChildDB {
@Id
@Unique
@NotNull
private String id;
private String parentId;
...
}
大约有4000多个ParentDB对象。并且至少有尽可能多的ChildDB对象。 现在,为了从DB对象映射我的业务对象(BO),我必须遍历所有父级并为每个父级获取子级。
List<Parent> parentList = new ArrayList<>();
for(ParentDB parentDB : ParentDBDao.loadAll()){
Parent parent = new Parent();
List<ChildDB> childrenDB = parentDB.getChildren()); // <- PROBLEM
... map each child to a BO ...
parent.setChildren(children);
parentList.add(parent);
}
此操作大约需要16-30秒! 当删除有问题的行时,加载所有父母大约需要400毫秒(这仍然是安静缓慢的afaik)
生成的getChildren()方法在内部执行类似于此的附加查询:
List<ChildDB> childrenNew = ChildDBDao._queryParentDB_Children(id);
我的猜测是循环中的4000个查询导致性能不佳。
作为一种解决方法,我正在加载所有孩子,并在代码中手动与他们各自的父母建立联系。这需要大约800毫秒,这是可以接受的但是无法实现ORDA DB的目的,例如greenDAO。 当ChilDB包含另一个Child2DB时,尤其如此,并且BO映射不能轻易地抽象出来但必须手动完成。
我是否采取了错误的方法或有没有办法消除瓶颈?