Performance 惰性数据表呈现非常慢 环境: PrimeFaces 5.1 莫哈拉2.2.2 Spring 4.0.2 问题:

Performance 惰性数据表呈现非常慢 环境: PrimeFaces 5.1 莫哈拉2.2.2 Spring 4.0.2 问题:,performance,primefaces,datatable,lazy-loading,Performance,Primefaces,Datatable,Lazy Loading,我使用了一个lazy=true的p:dataTable,并实现了一个LazyDataModel。 所有的工作都非常好分页,过滤等,但它是非常缓慢的 调用load方法时,它执行对DB的调用,并以3sec max返回。但在此之后,页面加载render?最多需要20sec 对于信息,页面通过ajax加载:侦听器向LazyModel setter提供信息,然后将页面更改为insert ui:insert,值存储在控制器中,最后更新表单update=:form 调试后,似乎我无法控制这个 代码: 控制器的

我使用了一个lazy=true的p:dataTable,并实现了一个LazyDataModel。 所有的工作都非常好分页,过滤等,但它是非常缓慢的

调用load方法时,它执行对DB的调用,并以3sec max返回。但在此之后,页面加载render?最多需要20sec

对于信息,页面通过ajax加载:侦听器向LazyModel setter提供信息,然后将页面更改为insert ui:insert,值存储在控制器中,最后更新表单update=:form

调试后,似乎我无法控制这个

代码: 控制器的相关代码:

@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;
    }
}
resit属性执行对数据库的调用

有什么想法吗

谢谢

编辑: 增加了控制器的相关代码 添加了LazyDataModel的代码 在HTML中添加代码:问题似乎来自于60+列的数量,更准确地说,来自于为构建这些列而进行的属性访问的数量。
你能添加更多的代码,比如控制器的相关部分吗?@MathieuCastets Done,但我认为这不会有帮助。问题是在LazyDataModel返回并调用之后出现的。事实上,查看您的LazyStoreWebModel(尤其是您的负载)将非常有用method@MathieuCastets完成。我还添加了其他重写方法。如果您有500列,并且每列中都有一个PrimeFaces selectOneMenu,这是意料之中的,并且会出现浏览器问题。。。或者换句话说:提供更详细的调试内容,并调查延迟的位置。。。使用例如相位指示器
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;
    }
}