Lazy DataTable渲染非常慢

时间:2015-05-13 08:31:43

标签: performance primefaces datatable lazy-loading

环境:

  • PrimeFaces 5.1
  • Mojarra 2.2.2
  • Spring 4.0.2

问题:

我使用p:dataTablelazy=true,我实现了一个LazyDataModel。 一切都很好(分页,过滤等),但它很慢......

调用load方法,它执行对DB的调用并最多返回3秒。但在那之后,加载页面需要 20秒(渲染?)......

有关信息,页面通过ajax加载:一个监听器向LazyModel(setters)提供信息,然后将页面更改为insert(ui:insert,存储在控制器中的值),最后更新表单({ {1}})。

调试后似乎我无法控制...

代码:

update=":form"

控制器的相关代码:

<p:dataTable id="storeTable"
        value="#{dashboard.stores}"
        var="store"
        lazy="true"
        paginator="true" rows="30"
        paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
        paginatorPosition="bottom">

    ...
    <!-- Columns -->
    ...
    <c:forEach var="date" items="#{dashboard.days}">
        <c:set var="day" value="#{store.getDay(date)}"/>

        <p:column styleClass="store-day open-#{store.isAmOpen(date.date)} store-day-available-#{store.isAvailable(date.date)} #{store.storeKey} #{day.date.time} am" 
                width="30">
            <h:outputText value="&#160;" title="#{day.amComment}" />
            <h:outputText styleClass="store" value="#{store.storeKey}" style="display: none" />
            <h:outputText styleClass="date" value="#{day.date.time}" style="display: none" />
            <h:outputText styleClass="am_pm" value="am" style="display: none" />
        </p:column>

        <p:column styleClass="store-day open-#{store.isPmOpen(date.date)} store-day-available-#{store.isAvailable(date.date)} #{store.storeKey} #{day.date.time} pm" 
                width="30">
            <h:outputText value="&#160;" title="#{day.pmComment}" />

            <h:outputText styleClass="store" value="#{store.storeKey}" style="display: none" />
            <h:outputText styleClass="date" value="#{day.date.time}" style="display: none" />
            <h:outputText styleClass="am_pm" value="pm" style="display: none" />
        </p:column>

    </c:forEach>

</p:dataTable>

LazyDataModel

@Controller("dashboard")
@Scope("session")
public class DashboardController implements Serializable {
    private static final long serialVersionUID = 1971543164359627877L;

    private LazyStoreWebModel stores;
    // Some more attributes

    @PostConstruct
    public void postCtr() {
        stores = new LazyStoreWebModel(restit);
        update();
    }

    private void updateGroupList() {
        groupList.clear();
        groupList.addAll(groupDao.findByCountry(countryFilter));
    }

    public void updateStoreChainTypeList() {
        storeChainTypeList.clear();
        storeChainTypeList.addAll(storeTypeDao.findByCountry(countryFilter));
    }

    public void updateStoreZoneList() {
        storeZoneList.clear();
        storeZoneList.addAll(storeZoneDao.findByCountryAndChainType(
                countryFilter, chainTypeFilter));
    }

    public void updateStoreRegionList() {
        storeRegionList.clear();
        if (storeZoneFilter != null) {
            storeRegionList.addAll(storeRegionDao.findByCountryAndZone(
                    countryFilter, storeZoneFilter));
        }
    }

    public void updateDays() {
        days.clear();
        days.addAll(calendar.generateListDateFromMonthAndYear(
                yearFilter, monthFilter.getCode()));
        stores.setYear(yearFilter);
        stores.setMonth(monthFilter.getCode());

        Collections.sort(days);
    }

    public void update() {    
        updateGroupList();
        updateStoreChainTypeList();
        updateStoreZoneList();
        updateStoreRegionList();
        updateDays();

        stores.setCountry(countryFilter);
        stores.setChainType(chainTypeFilter);
        stores.setRegion(storeRegionFilter);
        stores.setZone(storeZoneFilter);
    }

    public LazyDataModel<StoreWeb> getStores() {
        return stores;
    }
}

public class LazyStoreWebModel extends LazyDataModel<StoreWeb> { private static final long serialVersionUID = -4318420518897167924L; private RestitService restit; private Country country; private StoreChainType chainType; private StoreZone zone; private StoreRegion region; private Integer storeIntFlagFilter; private Integer year; private Integer month; public LazyStoreWebModel(RestitService restit) { this.restit = restit; } @Override public StoreWeb getRowData(String key) { try { return restit.visualisationStoreById(key, year, month); } catch (CalendarException e) { e.printStackTrace(); } catch (NotExistStoreException e) { e.printStackTrace(); } StoreWeb sto = new StoreWeb(); sto.setStoreDesc("Should be null"); sto.setStoreKey("NULL:" + key); return sto; } @Override public Object getRowKey(StoreWeb sto) { return sto.getStoreKey(); } @Override public List<StoreWeb> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> fieldFilters) { List<StoreWeb> result = new ArrayList<StoreWeb>(); Map<String, Object> mainFilters = new HashMap<String, Object>(); mainFilters.put(RestitService.COUNTRY_KEY, country); mainFilters.put(RestitService.CHAIN_TYPE_KEY, chainType); mainFilters.put(RestitService.ZONE_KEY, zone); mainFilters.put(RestitService.REGION_KEY, region); mainFilters.put(RestitService.INT_FLAG_KEY, storeIntFlagFilter); mainFilters.put(RestitService.YEAR_KEY, year); mainFilters.put(RestitService.MONTH_KEY, month); try { result.addAll(restit.load(first, pageSize, sortField, sortOrder, mainFilters, fieldFilters)); } catch (CalendarException e) { e.printStackTrace(); } catch (NotExistStoreException e) { e.printStackTrace(); } setRowCount(restit.count(mainFilters, fieldFilters)); return result; } } 属性执行对DB的调用。

有什么想法吗?

感谢。

编辑:

  1. 添加了控制器的相关代码
  2. 添加了LazyDataModel的代码
  3. 在HTML中添加了代码:问题似乎来自列数(60+),更准确地说来自构建它们的属性访问量。

0 个答案:

没有答案
相关问题