字段插件的Grails性能问题

时间:2013-12-20 12:49:09

标签: grails

我在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

2 个答案:

答案 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}"}

但是我觉得在处理大型收藏品时要付出的代价要小得多。