Wicket LoadableDetachableModel-在ajax请求期间不必要的分离

问题描述 投票:1回答:3

我注意到,Wicket的LoadableDetachableModel(LDM)根据设计(通过RequestCycle.processRequestAndDetach())在每个请求上均分离。在某些情况下,这可能会导致性能问题,我想在保留缓存数据的同时仍然使用LDM的好处。

说您有一个具有ID的实体的详细信息页面。该页面分为多个选项卡(AjaxTabbedPanel)。如果打开页面,将从给定ID的数据库中读取实体(进入LDM)。如果单击第二个选项卡,则该模型已经分离,并将再次重新加载。就我而言,这不是必需的,因为我不想刷新每个请求的数据。

我希望在页面上使用LDM,以便可以使用页面历史记录(只有实体ID会被序列化并按需重新加载数据)。>>

那么,如何解决不必要的重载?

我想出了两种解决方案:

  1. 将LDM包装到静态模型中,因此它不会自动分离,仅在需要时才手动分离(=重新加载)。
  2. 实现LDM的子实现,该实现将保留瞬态数据并仅在为null时重新加载(如恢复序列化页面时一样)。然后可以重用此geenric模型。
  3. 我认为应该在检票口中实现这一解决方案,但是我找不到任何解决方案。您知道其他(标准)方式可以实现这一目标吗?

非常感谢您的回答。

PS:示例实现为2)

    private class MyEntityModel extends LoadableDetachableModel<MyEntity> {
    private String entityId;
    private transient MyEntity modelObject;

    public MyEntityModel(String entityId) {
        this.entityId = entityId;
    }

    //call this for explicit reload
    public void forceDetach() {
        modelObject = null;
        detach();
    }

    @Override
    protected MyEntity load() {
        if (modelObject != null) {
            return modelObject;
        }
        MyEntity entity = getData(entityId);
        modelObject = message;
        return message;
    }
}

更新:看来我最初的问题还不够清楚。抱歉当前行为:

  1. 检票页面已加载通过参数传递的entityID
  2. 创建了一个新的LDM实例,已将EntityID传递给它
  3. 当(在响应呈现期间)调用LDM.getObject()时,将从数据库中加载实体
  4. 呈现响应后,将调用LDM.detach()
  5. 已加载带有ajax控件的页面
  6. 当用户单击任何控件(如选项卡开关)时,将向服务器生成一个新请求
  7. 服务器交换选项卡,尝试用数据填充新的选项卡,因此它调用已在4中分离的LDM.getObject(),并再次加载数据]
  8. 响应发送到客户端,并调用LDM.detach()
  9. 期望的行为:广告4-调用LDM.detach()时,将保留瞬态模型对象广告7-如果瞬态模型对象仍在内存中,请使用它。否则加载数据

上面我描述了两种方法,如何实现这种行为。有什么标准或更好的方法?

我注意到,Wicket的LoadableDetachableModel(LDM)会按设计(通过RequestCycle.processRequestAndDetach()在每个请求上分离)。在某些情况下,这可能会导致性能问题,我会...

ajax performance wicket
3个回答
2
投票

有几个选项可以实现您想要的:


1
投票

我注意到,Wicket的LoadableDetachableModel(LDM)会按设计(通过RequestCycle.processRequestAndDetach()在每个请求上分离)。在某些情况下,这可能会导致性能问题,我想在保留缓存数据的同时仍然使用LDM的好处。


0
投票
大多数人都将使用ORM,无论是JDO还是JPA的实现,最有用的用例是“开放式持久性管理器/会话视图”。相信我,它是最有用的-我已经尝试了很长时间,通过尝试所有其他化身来避免出现这种情况,但是它们只是以眼泪和很多多余的错误代码结尾。

“视图中打开持久性管理器/会话”意味着,当您的应用程序收到HTTP请求时,它将获得一个新的持久性管理器/会话(具有其自己的L1缓存),然后您的代码根据需要加载对象以向Wicket组件提供内容通过IModel,然后组件将其在onDetach中具有的模型引用分离,然后在请求结束时关闭持久性管理器/会话。

© www.soinside.com 2019 - 2024. All rights reserved.