【问题标题】:Wicket and Hibernate optimal place for sorting and filteringWicket 和 Hibernate 进行排序和过滤的最佳位置
【发布时间】:2014-10-02 07:12:19
【问题描述】:

我的名字是 Hen,我正在开发一个 Apache Wicket Web 应用程序,该应用程序当然有一个页面,其中包含一些数据作为表,这些数据是通过休眠和使用 wicket 数据提供程序的 DAO 从数据库中获取的。

这些数据应该可以按列排序,并且可以通过一些下拉菜单进行过滤。

我问自己的真正问题是,在哪里应用过滤器和搜索条件。

每次单击列或通过下拉列表选择值时,我都可以让 hibernate 进行提升,但始终会从数据库中新获取数据。

我想只在一个时间间隔内重新加载数据或重新加载整个页面会更高效。

现在真正的问题是,我应该只在页面加载时从数据库中“按原样”获取一次数据并缓存列表并在结果列表上应用过滤器和排序,还是应该让提升休眠每次单击列或选择过滤器值时?

我们将不胜感激。

最好的问候

母鸡

P.S.:英语不是我的母语,我想提前原谅。

【问题讨论】:

    标签: hibernate sorting wicket filtering dataview


    【解决方案1】:

    我认为你应该在WicketDAO 中尽可能多地在Hibernate 中执行显示逻辑

    我建议使用DataTableSortableDataProvider

    看这个例子:

    https://cwiki.apache.org/confluence/display/WICKET/Simple+Sortable+DataTable+Example

    实现iterator() 方法以使用您的Hibernate 查询并返回您需要的项目。

    如果您只关心某些行以某种方式发生更改,您也可以使用AjaxDataTable

    如果您担心访问数据库,您应该研究 Hibernate Caching 技术。

    【讨论】:

      【解决方案2】:

      母鸡。

      解决方案取决于几个项目,例如您希望有多少用户使用您的 WebApp、您的表将包含多少结果以及您的 JVM 有多少内存。

      当我们在第一个项目中开发搜索结果列表时,我们只是将所有结果加载到缓存中并存储它们直到用户会话没有结束。当内存耗尽时,它会导致这样的延迟(因为 GC 工作),我们不得不一次又一次地重新启动服务器。

      但另一方面,用户可以根据需要对结果进行排序。最大结果是大约 5000 个元素,我们在 PageableListView 中显示它们。在这个项目中没有那么多用户,我们通过减少会话时间和增加服务器内存来解决这个问题。

      在我们的第二个项目中,我们开发了动态PageableListView,它仅在打开特定页面时才加载项目。

      ListView 初始化时,我们使用初始排序搜索对象,但仅从 db 获取 IDS 并将它们作为 ListView 的模型传递。然后,当打开特定页面时,我们只加载少量项目并缓存它们。这样的逻辑可以通过覆盖PageableListViewonBeforeRender()方法得到,比如:

       @Override
       protected void onBeforeRender() {
            loadSubList((int) getCurrentPage());
            super.onBeforeRender();
       }
      

      所以,当populateItem( ListItem<String> item )被调用时,我们只是根据item.getModelObject()的值从缓存中获取真实对象。

      当然,当我们需要resort items的时候,还有另外一个db request进行,但是相对于内存来说并没有那么大,你可以清除之前的缓存。

      在这种方法中,我没有发现使用 db 有任何滞后。

      我不确定,但我认为,我们也对数据表做了类似的事情。

      总而言之,你可以选择缓存所有项目,或者从数据库中获取它们,但你必须分析你开发的 WebApp 类型以及你拥有哪些资源,才能做出正确的决定。

      【讨论】:

        【解决方案3】:

        上面的问题来自我。谢谢你的详细信息。我不能再投票了,因为我得到了需要的答案。

        这是 Michael Zhavzharov 和 RobAu 的组合。

        我使用 DataView 并在 DAO 中进行缓存。在 DataProvider 迭代器中,我提供了所需的过滤器,我可以将其插入装饰器方法中,用所需的值过滤掉不需要的结果,并将它们与 sort() 一起插入,以从 hibernateDAO 中检索我的数据。

        数据将在某些事件时从数据库中重新加载,例如添加了新行。但除此之外仅在最初加载,其他请求将从缓存的列表中得到响应。

        如果有人对我尝试解决它的方式感兴趣...

        https://henhan.mensa.uberspace.de/java-filtering-and-sorting/

        非常感谢我:-D

        问候

        母鸡

        【讨论】:

          猜你喜欢
          • 2010-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多