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