【问题标题】:JSF + primefaces calling getter way too much timesJSF + primefaces 调用 getter 次数过多
【发布时间】:2013-05-15 05:53:04
【问题描述】:

我在 SO 上(不仅)阅读了有关此主题的所有答案,但这些都不能解决我的问题。 我有数据表:

<p:dataTable 
                value="#{reportBean.reportData.rows}"
                var="row" 
                styleClass="listBlock dataTableOverflowAuto fullScreenTable"
                rendered="#{!reportBean.reportData.grouped}">
                 <f:facet name="header">
                    #{msg['report.table.header']}
                </f:facet>

                <p:column>
                    #{row.integrationName}
                </p:column>

                <p:column>
                    #{row.integrationId}
                </p:column>

                <p:column>
                    #{row.service}
                </p:column>

                <p:columns value="#{reportBean.reportData.columns}"
                           var="column">  
                    <f:facet name="header">  
                        #{column}
                    </f:facet>  
                    <h:outputText value="#{row.getData(column)}" escape="false" />  
                </p:columns>

reportBean 上的getReportData() 非常简单(无需计算):

public ReportDataInterface getReportData() {
        return reportData;
}

并且返回的数据是:

public class NoneGroupedReportData implements ReportDataInterface {
    private int counter = 0;
    Logger logger = LoggerFactory.getLogger(getClass());
    private List<String> columns = new LinkedList<String>();
    public void addRow(Row row) {
        addColumns(row);
    }

    public List<String> getColumns() {
        counter++;
        logger.debug("getColumns called {} times", counter);
        return columns;
    }

....

结果是

2013-05-15 07:38:07,405 () 调试 NoneGroupedReportData - getColumns 调用21600次

对于具有约 30 行和 10 列的数据表。

我知道为什么 JSF 多次调用 getter,但几乎是 22k,为什么?当我需要更多结果(> 1000)时,它不会在 5 分钟内呈现,因为它会无休止地调用这个 getter。 问题出在哪里,如何实现每行最多调用 5~10 次 getColumns() 的状态?

我尝试过使用 jstl c:set "caching" 但没有任何结果 (http://qussay.com/2013/04/19/caching-and-reusing-an-evaluated-el-expression-in-jsf/)

编辑:我的猜测是 getter 调用不是“错误的”,而是表明我以错误的方式使用 dataTable。

【问题讨论】:

  • 你没有在这里给出完整的故事。 NoneGroupedReportData 的实例在哪里?
  • 它是视图范围的。 NoneGroupedReportData 的实例是托管 bean 的属性。
  • 您至少引用了 3 次 reportData,它们可能是不必要的。没有必要单独获取行和列。

标签: java performance jsf primefaces


【解决方案1】:

问题是你访问了两次相同的数据结构,

N: <p:dataTable value="#{reportBean.reportData.rows}" ...

然后 INSIDE 您正在使用的同一 p:dataTable

M: <p:columns value="#{reportBean.reportData.columns}" ...

这会导致一个 N * M 产品最终给你 21600 次,因为你正在访问 两个嵌套标签中的 same 数据结构强>...

目前尚不清楚您要构建哪种数据表,但我认为您应该重新组织您的数据结构。

更简单的解决方案,如果您尝试将多个值放在每一行的单个列中,将 M 更改为:

M: <p:columns value="#{rows.columns}" ...

但这将涉及更改您的数据结构以将您的 columns 组件放入您的 rows 组件中。

问候,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 2017-07-07
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多