我在Grails应用程序中遇到了性能问题。我正在使用fields plugin来渲染我的“创建”,“编辑”和“显示”脚手架视图,但是当我在我的开发数据库中有大量数据时,渲染页面的时间就会越来越多。
我在字段插件的FormFieldsTagLib.buildModel
方法中将其跟踪到此行:
def value = attrs.containsKey('value') ? attrs.remove('value') : propertyAccessor.value
看起来当propertyAccessor.value
引用包含大量实体的集合时(在我的数据库中我有一个可能约30000行的集合),此时它们都被取出。这似乎有点浪费,因为_field.gsp
片段可能最终无法对值进行任何操作。
首先,还有其他人遇到过这个问题吗?
如果没有,或许我在使用字段插件时出现了问题?
此外,我想到,当调用myDomainObject.myCollection
时,可能有一种方法可以让gorm / hibernate仅将集合中的第一个 n 项加载到内存中,但是在一些谷歌搜索之后它看起来似乎不太可能。
编辑:
我正在使用Grails 2.2.2和Fields插件1.3
答案 0 :(得分:0)
这不是来自插件的问题,这是一个数据模型问题,需要解决建模问题。
您的收藏品似乎是急切的,您应该首先验证这一点,请参阅Docs on lazy & eager fetching
您所说的“内存中的n个第一项”称为batch fetching
,并按n
成员组加载行
您还可以将页面显示为commented by @Sérgio Michels
以显示此字段答案 1 :(得分:0)
我通过修改FormFieldsTagLib.buildModel
方法来解决这个问题:
private Map buildModel(BeanPropertyAccessor propertyAccessor, Map attrs) {
//def value = attrs.containsKey('value') ? attrs.remove('value') : propertyAccessor.value
def valueDefault = attrs.remove('default')
[
bean: propertyAccessor.rootBean,
property: propertyAccessor.pathFromRoot,
type: propertyAccessor.propertyType,
beanClass: propertyAccessor.beanClass,
label: resolveLabelText(propertyAccessor, attrs),
//value: (value instanceof Number || value instanceof Boolean || value) ? value : valueDefault,
constraints: propertyAccessor.constraints,
persistentProperty: propertyAccessor.persistentProperty,
errors: propertyAccessor.errors.collect { message(error: it) },
required: attrs.containsKey("required") ? Boolean.valueOf(attrs.remove('required')) : propertyAccessor.required,
invalid: attrs.containsKey("invalid") ? Boolean.valueOf(attrs.remove('invalid')) : propertyAccessor.invalid,
prefix: resolvePrefix(attrs.remove('prefix')),
]
}
现在我已从模型中删除value
属性,我必须在每个_field.gsp
中获取我的属性值,如下所示:
${bean."${propertyName}"}
但是我觉得在处理大型收藏品时要付出的代价要小得多。