我的名字是Hen和我在Apache Wicket Web App上工作,当然有一个页面包含一些数据作为表格,通过hibernate从数据库中获取,使用wicket数据提供者从DAO中获取。
此数据应按列排序,并可通过某些下拉菜单进行过滤。
我问自己的真正问题是,在哪里应用过滤器和搜索条件。
每次单击一个列或通过下拉列表选择一个值时,我都可以让hibernate执行提升,但数据总是会从数据库中新获取。
我认为只在一个时间间隔内重新加载数据或重新加载整个页面会更高效。
现在真正的问题是,我应该只获取数据"按原样#34;一旦从数据库加载并缓存列表并在结果列表中应用过滤器和排序,或者我应该在每次单击列时选择休眠还是选择过滤器值?
我们将不胜感激。
最好的问候
编
P.S。:英语不是我的母语,我想提前赦免。
答案 0 :(得分:1)
我认为您应该尽可能在Wicket
和DAO
中尽可能多地使用Hibernate
中的显示逻辑
我建议使用DataTable
和SortableDataProvider
。
见这个例子:
https://cwiki.apache.org/confluence/display/WICKET/Simple+Sortable+DataTable+Example
实现iterator()
方法以使用您的Hibernate Query并返回您需要的项目。
如果你只关心某些行的重绘,你也可以使用AjaxDataTable
。
如果您担心访问数据库,则应该研究Hibernate缓存技术。
答案 1 :(得分:0)
编。
解决方案取决于几个项目,例如您希望使用WebApp的用户数量,表格将包含多少结果以及JVM具有多少内存。
当我们在第一个项目中开发搜索结果列表时,我们只是将所有结果加载到缓存中并存储它们直到用户会话没有结束。它造成了这样的滞后(因为GC工作),当内存结束时,我们不得不一次又一次地重启我们的服务器。
但另一方面,用户可以根据需要对结果进行排序。最大结果大约是5000个元素,我们在PageableListView
中显示它们。在这个项目中,没有那么多用户,我们通过减少会话时间和向服务器添加内存来解决这个问题。
在我们的第二个项目中,我们开发了动态PageableListView
,仅在打开特定页面时加载项目。
当ListView
初始化时,我们使用初始排序搜索对象,但只从db获取IDS并将其作为ListView
模型传递。然后,当打开特定页面时,我们只加载几个项目并缓存它们。可以通过覆盖onBeforeRender()
的{{1}}方法获得此类逻辑,例如:
PageableListView
因此,当调用 @Override
protected void onBeforeRender() {
loadSubList((int) getCurrentPage());
super.onBeforeRender();
}
时,我们只是根据populateItem( ListItem<String> item )
值从缓存真实对象中获取。
当然,当我们需要求助项目时,会有另一个db请求继续进行,但它相对于内存而言并不是那么大,你可以清除以前的缓存。
在这种方法中,我没有看到与使用db有任何滞后。
我不确定,但我认为,我们也做了类似于数据表的事情。
总而言之,您可以选择缓存所有项目,或从db中获取它们,但您必须分析您开发的WebApp类型以及您拥有的资源,以做出正确的决策。
答案 2 :(得分:0)
上面的问题来自我。谢谢你的详细信息。我不能投票了,我得到了所需的答案。
这是Michael Zhavzharov和RobAu的组合。
我使用DataView并在DAO中执行缓存。在DataProvider迭代器中,我提供了所需的过滤器,我可以在装饰器方法中插入,以使用所需的值过滤掉不需要的结果,并将它们与sort()一起插入以从hibernateDAO检索我的数据。
数据将在某些事件中从数据库重新加载,例如添加新行。但除非最初只加载,否则其他请求将从缓存的列表中回答。
如果有人对我试图解决它的方式感兴趣......
https://henhan.mensa.uberspace.de/java-filtering-and-sorting/
很多,非常感谢我:-D
问候
编