Primefaces实时滚动需要很长时间才能使用大型数据集

时间:2014-02-21 07:29:39

标签: performance jsf-2 primefaces datatable

嗨我有一个带有大约52000条记录的primefaces数据表。由于它是一个大型数据集,我尝试使用滚动行等于20的primefaces的实时滚动功能。列数为53.该表还有每个列上的过滤和排序功能。我对表的性能不满意。页面加载大约需要15秒,最糟糕的是下一组20条记录需要大约65秒才能完成。在滚动结束时加载。

仅仅为了测试,我将记录总数减少到25000,并且滚动时间为29秒,性能提高了。我真的无法理解为什么只显示20条记录需要花费这么多时间一次。记录总数不应影响性能。

有人可以建议如何提高性能。我不能为此实现分页,因为我的客户不想要它。谢谢提前

我的JSF代码段

<p:dataTable id="arcRecList" var="data"
            value="#{archivedRecordBean.archiveItems}"
            tableStyle="table-layout:auto; width:80%;" styleClass="datatable"
            scrollable="true" scrollWidth="84%" scrollHeight="69%"
            columnClasses="columnwidth" liveScroll="true" scrollRows="20"
            filteredValue="#{archivedRecordBean.filteredArchiveItems}">


            <p:column style="width:250px" headerText="Insured"
                filterBy="#{data.insuredName}" sortBy="#{data.insuredName}">
                <h:outputText value="#{data.insuredName}" />
            </p:column>

            <p:column style="width:250px" headerText="City"
                filterBy="#{data.custAddress_City}"
                sortBy="#{data.custAddress_City}">
                <h:outputText value="#{data.custAddress_City}" />
            </p:column>
                .
                .
                .53 columns
                .
        </p:dataTable>

我的托管豆

@ManagedBean

@RequestScoped

public class ArchivedRecordBean实现了Serializable {

private List<WorkSpaceItem> archiveItems=null;
private List<WorkSpaceItem>filteredArchiveItems;
private WorkSpaceItem objWorkSpaceItem=null;
JdbcConnection jdbcConnection=null;
Connection connection=null;
Statement selectStmt=null;
ResultSet rs=null;
public ArchivedRecordBean()

{   
    getArchiveFields();

}
public List<WorkSpaceItem> getArchiveItems() {
    return archiveItems;
}
public void setArchiveItems(List<WorkSpaceItem> archiveItems) {
    this.archiveItems = archiveItems;
}
public WorkSpaceItem getObjWorkSpaceItem() {
    return objWorkSpaceItem;
}
public void setObjWorkSpaceItem(WorkSpaceItem objWorkSpaceItem) {
    this.objWorkSpaceItem = objWorkSpaceItem;
}

public List<WorkSpaceItem> getFilteredArchiveItems() {
    return filteredArchiveItems;
}
public void setFilteredArchiveItems(List<WorkSpaceItem> filteredArchiveItems) {
    this.filteredArchiveItems = filteredArchiveItems;
}
public void getArchiveFields()
{
    try
    {
        jdbcConnection=new JdbcConnection();
        connection=jdbcConnection.getJdbcConnection();
        selectStmt=connection.createStatement();
        String query="select * from LPINFO where LPINFO.ClearDate < (select TOP 1 Tbl_CurrentYear.CurrentYear from dbo.Tbl_CurrentYear)"
                +"AND (LPINFO.ClearDate is not null)";
        rs=selectStmt.executeQuery(query);
        archiveItems=new ArrayList<WorkSpaceItem>();
        while(rs.next())
        {

            objWorkSpaceItem=new WorkSpaceItem();
            objWorkSpaceItem.setInsuredName(rs.getString("InsuredName"));
            objWorkSpaceItem.setCustAddress_City(rs.getString("CustAddress_City"));
            objWorkSpaceItem.setCustAddress_State(rs.getString("CustAddress_State"));
            .
            .
            .//Setting the values for remaining columns
            .
            .
            archiveItems.add(objWorkSpaceItem);

        }

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        try {

            connection.close();
        } catch (SQLException e) {

            e.printStackTrace();
        }

    }

}

}

2 个答案:

答案 0 :(得分:0)

尝试将托管bean更改为@ViewScoped。我现在不能做一个测试,但据我所知,在每个HTTP请求上创建了一个requestScoped bean,所以我认为问题可能是你在每个滚动上查询数据库。这可以解释为什么加载时间随着表中记录的减少而减少。

答案 1 :(得分:0)

我花了很长时间,因为你在每次请求时从数据库加载所有项目(每次请求都会重新创建@RequestScope bean)。

如果您更改为@ViewScope,您将只加载一次数据,但它们都将存储在会话中,从而减慢您的服务器速度。如果您在客户端中保存状态,则会对网络使用产生巨大影响,并且由于序列化/反序列化而导致CPU使用率非常高。也不是一个好主意。

您应该至少实现LazyDataModel,并始终限制从数据库中读取的数据量(从UX视图中为最终用户提供> 1000页是没有意义的)。