Dom*_*ikM 1 java performance jsf primefaces
我在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>
Run Code Online (Sandbox Code Playgroud)
reportBean上的getReportData()非常简单(无计算):
public ReportDataInterface getReportData() {
return reportData;
}
Run Code Online (Sandbox Code Playgroud)
返回的数据是:
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;
}
....
Run Code Online (Sandbox Code Playgroud)
结果是
2013-05-15 07:38:07,405()DEBUG NoneGroupedReportData - getColumns调用了21600次
对于包含~30行和10列的dataTable.
我知道为什么JSF多次调用getter,但差不多22k,为什么?当我需要更多结果(> 1000)时,它将无法在5分钟内渲染,因为它无休止地调用此getter.问题出在哪里?如何实现每行调用getColumns()最多5~10次的状态?
我尝试过使用jstl c:set"caching"但没有任何结果(http://qussay.com/2013/04/19/caching-and-reusing-an-evaluated-el-expression-in-jsf/)
编辑:我的猜测是,getter调用并非"错误",而是表示我以错误的方式使用dataTable.
问题是你访问了两次相同的数据结构,
N: <p:dataTable value="#{reportBean.reportData.rows}" ...
Run Code Online (Sandbox Code Playgroud)
然后INSIDE你正在使用的p:dataTable
M: <p:columns value="#{reportBean.reportData.columns}" ...
Run Code Online (Sandbox Code Playgroud)
这导致N*M产品的末端给出了21600次,因为您在两个嵌套标签中访问相同的数据结构...
目前尚不清楚你想构建什么样的数据表,但我认为你应该重新组织你的数据结构.
更简单的解决方案,如果您尝试将多个值放在每行的一个列中,则会将M更改为:
M: <p:columns value="#{rows.columns}" ...
Run Code Online (Sandbox Code Playgroud)
但这将涉及更改数据结构以将列组件放入行组件中.
问候,
| 归档时间: |
|
| 查看次数: |
1614 次 |
| 最近记录: |