You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin 24中TwinColSelect.setItems设置900条数据渲染缓慢求助

Vaadin 24 TwinColSelect 加载900条数据渲染缓慢的解决方案

针对你遇到的Vaadin 24中TwinColSelect设置900条数据渲染远慢于Vaadin 23的问题,以下是几个实用的优化方案:

1. 启用服务器端渲染模式

Vaadin 24的TwinColSelect默认采用客户端全量渲染,会一次性将所有数据序列化传输到客户端,这是导致渲染延迟的核心原因之一。而Vaadin 23的实现可能默认使用了更高效的服务器端渲染逻辑。

你可以通过开启服务器端渲染,让客户端仅加载当前可见的选项,大幅减少初始渲染的数据量:

// 启用服务器端渲染
twinCol.setServerSideRenderingEnabled(true);

// 再设置数据
List<Data> data = databaseService.findAllSortedByName(); // 建议数据库层面排序
twinCol.setItems(data);

2. 用数据库层面排序替代内存排序

你的代码中在内存中对900条数据排序,会额外消耗CPU和内存资源。如果数据库支持排序,直接让SQL返回已排序的结果,能减少前端处理时间:

// 替换原有的内存排序,改为从数据库获取已排序的数据
List<Data> data = databaseService.findAllSortedByName();
// 移除原有的 data.sort(Comparator.comparing(Data::getName));
twinCol.setItems(data);

3. 优化数据对象的序列化

Vaadin会将Data对象完整序列化后传输到客户端,如果对象包含大量不必要的字段,会增加传输体积和客户端解析时间。通过@JsonIgnore注解排除不需要的字段,减少序列化数据量:

public class Data {
    private Long id;
    private String name;
    
    // 忽略不需要传到客户端的冗余字段
    @JsonIgnore
    private String largeDescription;
    @JsonIgnore
    private byte[] binaryData;

    // getter/setter方法
}

4. 使用分页数据提供者(可选)

如果启用服务器端渲染后仍有性能问题,可以结合CallbackDataProvider实现分页加载,让数据库每次仅返回当前需要的片段数据:

CallbackDataProvider<Data, Void> dataProvider = DataProvider.fromCallbacks(
    // 分页查询数据
    query -> {
        int offset = query.getOffset();
        int limit = query.getLimit();
        return databaseService.findPaginatedAndSorted(offset, limit).stream();
    },
    // 总数据量
    query -> databaseService.countTotal()
);

twinCol.setServerSideRenderingEnabled(true);
twinCol.setItems(dataProvider);

这些方案针对性解决了Vaadin 24中TwinColSelect的渲染性能问题,无需异步加载导致的延迟,也避开了懒加载的局限性。

内容的提问来源于stack exchange,提问作者shweta singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:53:17