gpt4 book ai didi

java - 在 DataProvider 中使用 LoadableDetachableModel 有何目的?

转载 作者:行者123 更新时间:2023-12-02 08:01:57 25 4
gpt4 key购买 nike

由于仍然不是 100% 清楚何时应该使用 LDM,所以我尝试了一个简单的内存测试。我使用 DataProvider 创建了一个 DataView,它只是创建了一个包含 100 个实体的列表,其中包含一些大数据(长字符串):

    private class HeavyDataProvider implements IDataProvider<HeavyBean> {

@Override
public void detach() {
}

@Override
public Iterator<? extends HeavyBean> iterator(int first, int count) {
List<HeavyBean> l = newArrayList();
for (int i = 0; i < this.size(); i++) {
l.add(new HeavyBean());
}
return l.iterator();
}

@Override
public IModel<HeavyBean> model(HeavyBean heavyBean) {
return new CompoundPropertyModel<HeavyBean>(heavyBean);
}

@Override
public int size() {
return 500;
}
}

使用 wicket 的 DebugBar 可以看到这会创建一个大小为 5MB 的页面。在DataProvider的javadoc中指出,上述模型方法中的模型返回通常是可分离的,所以我将此方法更改为:

        @Override
public IModel<HeavyBean> model(final HeavyBean heavyBean) {
return new LoadableDetachableModel<HeavyBean>() {

@Override
protected HeavyBean load() {
return heavyBean;
}
};
}

我天真地期望页面大小现在会大幅减小,因为重 bean 将不再是模型的一部分。实际结果:5MB。由于模型将分离 HeavyBean,这必定意味着其他东西仍然保留着它(DataView?Item?)。

我看到了其他示例,其中 DataView 和 DataProvider 以类似的方式组合,但对我来说,不清楚重点是什么,因为它似乎在 pageSize/内存使用方面没有任何区别。

那么,我是否理解/做错了什么(可能)或者LDM在DataProviders中没有用?附带问题(抱歉),在什么情况下您会使用 LDM?

最佳答案

您对 LDM 的实现完全是错误的。它持有对 bean 本身的直接引用,并且只是返回它。这样,bean 将沿着模型进行序列化,使其完全毫无意义。

你应该这样做:

@Override
public IModel<HeavyBean> model(final HeavyBean heavyBean) {
final Integer id = heavyBean.getId();
return new LoadableDetachableModel<HeavyBean>() {
@Override
protected HeavyBean load() {
return ServiceLocator.get(HeavyDao.class).get(id);
}
};
}

如果您使用 wicket-ioc 模块,则 HeavyDao 引用可以注入(inject)到封闭的页面/组件中。

我认为 Wicket 确实很容易使用,但你必须了解 Java 序列化的基础知识,否则你可能会得到一个非常臃肿的 http session 。

关于java - 在 DataProvider 中使用 LoadableDetachableModel 有何目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8781260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com