我正在使用Grails 2.4.4并使用以下方法从数据库中查询实体列表:
List<Entity> entities = Entity.findAllByCode("code");
查询非常快,返回大约9000行。问题是当我尝试迭代列表时:
entites.each {
// Do something in here
}
迭代列表(循环内没有任何内容)将花费9秒钟。
根据我的发现,这是由于GORM将MongoResultList中的每个元素转换为Entity对象(来自DBObjects)。
还有其他方法可以迭代这个列表吗?在de / serialization过程中是否有一些我可以改变以提高性能的东西?
更新:
以下是MongoResultList类的相关部分,它是主要的瓶颈。每当我遍历列表时,就会调用它。第二次,迭代速度提高了几个数量级。
@SuppressWarnings("unchecked")
@Override
public Object get(int index) {
if(initializedObjects.size() > index) {
return initializedObjects.get(index);
}
else if(!initialized) {
while(cursor.hasNext()) {
if(internalIndex > index) throw new ArrayIndexOutOfBoundsException("Cannot retrieve element at index " + index + " for cursor size " + size());
Object o = convertDBObject(cursor.next());
initializedObjects.add(internalIndex,o);
if(index == internalIndex++) {
return o;
}
}
initialized = true;
}
throw new ArrayIndexOutOfBoundsException("Cannot retrieve element at index " + index + " for cursor size " + size());
}
这是耗费时间的convertDBObject()
方法调用。原因是反序列化,但它们是更好的选择吗?
答案 0 :(得分:0)
如果创建Entity
实例是瓶颈,您可以尝试仅检索所需的属性:
def rows = Entity.withCriteria {
eq('code', code)
projections {
property('a')
property('b')
property('c')
}
}
上面显示的条件查询将返回List
,如下所示:
[
[1, 2, 3],
[4, 5, 6]
]
如果您需要有关投影的更多信息,我可以获得article。