我有大量的对象,每个对象包含许多图像。我想使用延迟加载来部分获取它们。而且我想了解如何使用LazyDataModel及其工作原理。
最初,我认为我必须仅保存 LazyDataModel 中可能提取的对象的ID 。还有调用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;
}
我无法使其工作,因为素数使用了lock()方法并在应该加载新数据部分时引发了异常:
org.springframework.webflow.conversation.impl.LockTimeoutException: 30秒后无法获取会话锁定
最后,我了解LazyDataModel的素字样示例(其中保存到 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如何工作并提高性能。如果使用此方法的正确方法是从数据库检索所有数据并将其保存到 datasource 。 Primefaces是否将此数据保留在服务器上并部分刷新? 如果sql结果包含数千个图像怎么办,我应该寻找一种不同的方法并设置检索记录的限制吗?如何实现最佳的延迟加载性能提升?还是最初的方法是正确的,我应该调查为什么会发生此错误?
答案 0 :(得分:0)
好吧,我终于做到了,我认为应该在每次调用load()方法时执行查询的想法是正确的。
我面临的问题:
源代码:
private List<MyEntity> datasource; // contains only ids
@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
StringBuilder queryText = new StringBuilder("select ...");
List<MyEntity> list;
//paginate
if(datasource.size() > pageSize) {
try {
list = new ArrayList<>(datasource.subList(first, first + pageSize));
}
catch(IndexOutOfBoundsException e) {
list = new ArrayList<>(datasource.subList(first, first + (datasource.size() % pageSize)));
}
}
else {
list = new ArrayList<>(datasource);
}
boolean setComa = false;
for (MyEntity a: list) {
if (setComa) {
queryText.append(","+a.getId());
} else {
queryText.append(a.getId());
setComa = true;
}
}
queryText.append(")");
Query q = em.createQuery(queryText.toString());
list = q.getResultList();
return list.subList(0, list.size());
}
更新限制:
@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
List<MyEntity> list;
Query q = em.createQuery(this.queryText);
// Paginate
q.setFirstResult(first);
q.setMaxResults(pageSize);
list = query.getResultList();
return list.subList(0,list.size());
}