我注意到,Wicket的LoadableDetachableModel
(LDM)根据设计(通过RequestCycle.processRequestAndDetach()
)在每个请求上均分离。在某些情况下,这可能会导致性能问题,我想在保留缓存数据的同时仍然使用LDM的好处。
说您有一个具有ID的实体的详细信息页面。该页面分为多个选项卡(AjaxTabbedPanel
)。如果打开页面,将从给定ID的数据库中读取实体(进入LDM)。如果单击第二个选项卡,则该模型已经分离,并将再次重新加载。就我而言,这不是必需的,因为我不想刷新每个请求的数据。
我希望在页面上使用LDM,以便可以使用页面历史记录(只有实体ID会被序列化并按需重新加载数据)。>>
那么,如何解决不必要的重载?
我想出了两种解决方案:
我认为应该在检票口中实现这一解决方案,但是我找不到任何解决方案。您知道其他(标准)方式可以实现这一目标吗?
非常感谢您的回答。
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; } }
更新:看来我最初的问题还不够清楚。抱歉当前行为:
期望的行为:广告4-调用LDM.detach()时,将保留瞬态模型对象广告7-如果瞬态模型对象仍在内存中,请使用它。否则加载数据
上面我描述了两种方法,如何实现这种行为。有什么标准或更好的方法?
我注意到,Wicket的LoadableDetachableModel(LDM)会按设计(通过RequestCycle.processRequestAndDetach()在每个请求上分离)。在某些情况下,这可能会导致性能问题,我会...
有几个选项可以实现您想要的:
我注意到,Wicket的LoadableDetachableModel(LDM)会按设计(通过RequestCycle.processRequestAndDetach()在每个请求上分离)。在某些情况下,这可能会导致性能问题,我想在保留缓存数据的同时仍然使用LDM的好处。
“视图中打开持久性管理器/会话”意味着,当您的应用程序收到HTTP请求时,它将获得一个新的持久性管理器/会话(具有其自己的L1缓存),然后您的代码根据需要加载对象以向Wicket组件提供内容通过IModel,然后组件将其在onDetach中具有的模型引用分离,然后在请求结束时关闭持久性管理器/会话。