【发布时间】:2019-03-10 16:38:26
【问题描述】:
我有一个庞大的对象列表,每个对象都包含许多图像。我想使用延迟加载来部分获取它们。我想了解如何使用 LazyDataModel 以及它是如何工作的。
最初我认为我必须只保存 LazyDataModel 中可能获取的对象的 ids。 当调用 load() 方法时 - 我必须从数据库中获取图像 并将 datasource 替换为获取的数据。所以每次我想加载更多数据时,我都会运行查询。
private List<MyEntity> datasource; // contains only ids of MyEntity
@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
//rowCount
int dataSize = datasource.size();
this.setRowCount(dataSize);
//get listOfIdToFetch
//paginate
datasource = datasource.addAll(myJpaRepository.findByIds(listOfIdToFetch));
return datasource;
}
我无法让它工作,因为 primefaces 使用 lock() 方法并在应该加载新部分数据时抛出异常:
org.springframework.webflow.conversation.impl.LockTimeoutException: 30 秒后无法获取对话锁
最后我明白了 LazyDataModel 的 primefaces 示例(其中保存到 datasource 的完整数据列表,包括所有图像)可能是正确的使用方式。因为最初我认为它是简化的虚拟示例,在实际项目中我将使用 sql 查询来部分获取图像。
private List<MyEntity> datasource; // contains all images of all records
@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
//rowCount
int dataSize = datasource.size();
this.setRowCount(dataSize);
//paginate
return datasource.subList(first, first + pageSize);
}
我想了解 LazyDataModel 如何工作并提高性能。如果使用这种方法的正确方法是从 DB 中检索所有数据并将其保存到 datasource。 Primefaces 是否将这些数据保存在服务器上并部分刷新? 如果sql结果包含数千张图片怎么办,我应该寻找不同的方法并设置检索记录的限制吗?如何实现最好的延迟加载性能提升?或者也许最初的方法是正确的,我应该调查为什么会出现这个错误?
【问题讨论】:
-
整个想法是您只查询
myJpaRepository中需要的页面,而不是所有内容,然后从所有结果中获取一个页面。
标签: java primefaces lazy-loading lazydatamodel