适用于大表大小的 Java wicket dataprovider

2024-01-16

我正在为带有 MySQL 数据库的 EJB3 java 应用程序开发一个 wicket 前端。该网站主要是提交表格和显示表格。对于这些表,我更喜欢创建 IDataProviders,它与 AjaxPagingNavigation 配合得很好。但我有一些非常大的表,并且 IDataProvider 的大小函数实现起来有点棘手。通常我使用计数进行查询,这在大多数情况下表现良好,但我有一些大表,其中计数花费的时间太长(3s+)。现在我可以使用一些选项,但我不太高兴使用其中任何一个,所以这就是为什么我问,有人知道为大表实现 size() 函数的优雅解决方案吗?

我在 Google 上找到的第一个选项是使用具有限制结果的子查询并执行计数。但由于我主要使用命名查询和 EJB3,所以感觉很糟糕,而且如果发生变化,可能会很难维护。

第二个选项是使用 ListDataView,只对表进行有限的查询,并省略大量查询的需要。到目前为止,这个解决方案是我最喜欢的,但并不是最好的,因为它(几乎)总是获得最大数量的记录。我还必须在存储此 List 对象或在请求之间再次查询数据库之间进行选择。

我发现的最后一个选项是欺骗尺寸选项。我还没有实现这个,但我可以使 IDataProvider 的 size() 函数返回类似 pagesize + 1 的内容。这会带来一些其他问题,例如记录的页数。有一些检查可以捕获这些,但这也很混乱。

有人知道在 wicket 中使用 IDataProvider 来显示大型数据库表的分页表的优雅解决方案吗?

非常感谢,马丁


我已经使用数据提供程序实现了网格视图,它只需要迭代器,不需要大小信息 - 它称为IterableGridView

这是代码:https://github.com/maciejmiklas/cyclop/tree/master/cyclop-wicket-components https://github.com/maciejmiklas/cyclop/tree/master/cyclop-wicket-components

可迭代网格视图基于 Wicket 的GridView,但是它不适用于IDataProvider但与IterableDataProvider。这个新的数据提供程序仅依赖于普通的 java 迭代器 - 不需要大小信息,也不需要为每个页面创建范围迭代器。

final List<String> myGridData = new ArrayList<>();
myGridData.add("value 1");
myGridData.add("value 2");

IterableDataProvider<String> iterableDataProvider = new IterableDataProvider<String>(10) {
    @Override
    protected Iterator<String> iterator() {
        return myGridData.iterator();
    }

    @Override
    public IModel<String> model(String s) {
        return Model.of(s);
    }

    @Override
    public void detach() {
    }
};

IterableGridView<String> myGrid = new IterableGridView<String>("myGrid", iterableDataProvider) {
    @Override
    protected void populateEmptyItem(Item<String> item) {
        item.add(new Label("myValue"));
    }

    @Override
    protected void populateItem(Item<String> item) {
        item.add(new Label("myValue", item.getModelObject()));
    }
};

add(myGrid);

myGrid.setItemsPerPage(10);

// you have to use custom pager and not AjaxPagingNavigator
IterablePagingNavigator pager = new IterablePagingNavigator("rowNamesListPager", rowNamesList);
resultTable.add(pager);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于大表大小的 Java wicket dataprovider 的相关文章

随机推荐