我讀過關於這個主題的所有答案(不僅僅是),但是這些都不能解決我的問題。 我有數據表:JSF + primefaces調用getter方式的次數太多了
<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>
getReportData()上reportBean很簡單(沒有計算):
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年5月15日0 7:38:07405()DEBUG NoneGroupedReportData - getColumns 稱爲21600倍
對於與dataTable的30〜行和10列。
我知道爲什麼JSF調用干將多次,但幾乎22K,爲什麼呢?當我需要更多結果(> 1000)時,它不會在5分鐘內渲染,因爲它無休止地調用這個吸氣劑。 問題在哪裏,我怎樣才能達到getColumns()被調用的每行最多5〜10次的狀態?
我一直在使用JSTLÇ嘗試:設置「緩存」,但沒有任何結果(http://qussay.com/2013/04/19/caching-and-reusing-an-evaluated-el-expression-in-jsf/)
編輯:我的猜測是,吸呼不是「錯誤」,但簽署,我在錯誤的方式使用的dataTable 。
你沒有在這裏給出完整的故事。 'NoneGroupedReportData'實例在哪裏? – kolossus
它是視圖範圍。 NoneGroupedReportData的實例是託管bean的屬性。 – DominikM
您引用reportData至少3次,它們可能是不必要的。沒必要單獨獲取行和列。 – erencan