【发布时间】:2021-12-24 18:05:03
【问题描述】:
Vaadin 14. CallbackDataProvider。当服务很慢并且响应时间很长时,连接到 CallbackDataProvider 的网格会在所有 UI 中冻结。 一些例子:
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.data.provider.CallbackDataProvider;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.router.RouteAlias;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
public class GridWithSortableColumnsView extends VerticalLayout {
public GridWithSortableColumnsView() {
addClassName("dialogwithgrid-view");
setSizeFull();
// prepare Data
List<GridRow> gridRows = new LinkedList<>();
for (int i = 0; i < 10000; i++) {
gridRows.add(new GridRow(i, RandomStringUtils.randomAlphanumeric(10)));
}
CallbackDataProvider<GridRow, Void> dataProvider = new CallbackDataProvider<>(
query -> {
// Slow service answer is here
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Notification.show("Offset=" + query.getOffset() + " Limit=" + query.getLimit());
return gridRows.stream()
.sorted((o1, o2) -> StringUtils.compare(o1.getCol05(), o2.getCol05()))
.skip(query.getOffset())
.limit(query.getLimit());
},
query -> gridRows.size());
Grid<GridRow> grid = new Grid<>();
grid.setPageSize(10);
grid.setSizeFull();
grid.addColumn(GridRow::getId).setHeader("Id");
grid.addColumn(GridRow::getCol05).setHeader("col05");
grid.setDataProvider(dataProvider);
add(grid);
}
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@AllArgsConstructor
@Getter
@Setter
public static class GridRow {
@EqualsAndHashCode.Include
private int id;
private String col05;
}
}
在滚动此 Grid 时会话被锁定并且所有 UI 组件都冻结。 它如何更快和更异步?我考虑在自己的 DataProvider 中缓存扩展 CallbackDataProvider,但它会在 Grid 在第一次请求时收到空数据后填充,并且可能仅在一段时间后再次刷新 DataProvider 后使用。这对我没用。在我的实际项目中,获取的数据经常变化并且有很多项目,一个网格最多 100000 个项目,所以我需要使用具有有限请求大小的 CallbackDataProvider。
【问题讨论】:
-
问题是:为什么你的服务很慢?
-
这是一个数据库查询。有时它很慢,没有可能加快它。数据库是外部项目。
-
也许我会尝试在自己的 DataProvider 中注入一些异步回调。但是有些情况下,首先 Grid 数据请求它接收带有空实体的 Stream,并且在将正确的数据缓存到缓存后,我将手动调用相同偏移量的刷新并限制缓存中的数据。将发生两次刷新。
标签: callback vaadin-flow dataprovider vaadin-grid vaadin14