当前位置: 首页 > 知识库问答 >
问题:

Primefaces LazyDataModel:(过时)

袁雅逸
2023-03-14

我有一个巨大的对象列表,每个对象都包含许多图像。我想使用延迟加载来部分获取它们。我想了解如何使用LazyDataModel以及它是如何工作的。

最初,我认为我必须在LazyDataModel中只保存潜在获取对象的ID。当load()方法调用时-我必须从DB中获取图像并用获取的数据替换数据源。所以每次我想加载更多数据时,我都会运行查询。

private List<MyEntity> datasource; // contains only ids of MyEntity

@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
    //rowCount
    int dataSize = datasource.size();
    this.setRowCount(dataSize);

    //get listOfIdToFetch

    //paginate
    datasource = datasource.addAll(myJpaRepository.findByIds(listOfIdToFetch));
    return datasource;
}

我无法让它工作,因为primefaces使用lock()方法,并在应该加载新数据部分时引发异常:

org.springframework.webflow.conversation.impl.LockTimeoutException:30秒后无法获得会话锁定

最后,我明白了primefaces是LazyDataModel的一个例子(其中保存到数据源的完整数据列表,包括所有图像),这可能是正确的使用方法。因为最初我认为这是一个简化的虚拟示例,在实际项目中,我将使用sql查询一部分一部分地获取图像。

private List<MyEntity> datasource; // contains all images of all records
@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
    //rowCount
    int dataSize = datasource.size();
    this.setRowCount(dataSize);

    //paginate
    return datasource.subList(first, first + pageSize);
}

我想了解LazyDataModel是如何工作并提高性能的。使用这种方法的正确方式是从DB中检索所有数据,并将其保存到datasource。Primefaces会在服务器上保存这些数据并逐部分刷新吗?如果sql结果包含数千个图像,我应该寻找不同的方法并设置检索记录的限制吗?如何实现最佳的延迟加载性能提升?或者也许最初的方法是正确的,我应该调查为什么会出现这种错误?

共有1个答案

安坚诚
2023-03-14

好吧,我终于做到了,每次触发load()方法时我都应该执行查询的想法是正确的。

我面临的问题:

  1. 如果我只返回查询的结果 - load() 方法只被触发一次,我无法加载更多数据。所以我使用虚拟子列表(0,chunkSize)。
  2. 我无法@Autowire我的存储库,我有一个异常,说某些对象未序列化。但我可以使用EntityManager,这就是我所做的。

源代码:

private List<MyEntity> datasource; // contains only ids

@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {
        StringBuilder queryText = new StringBuilder("select ...");
        List<MyEntity> list;

        //paginate
        if(datasource.size() > pageSize) {
            try {
                list = new ArrayList<>(datasource.subList(first, first + pageSize));
            }
            catch(IndexOutOfBoundsException e) {
                list = new ArrayList<>(datasource.subList(first, first + (datasource.size() % pageSize)));
            }
        }
        else {
            list = new ArrayList<>(datasource);
        }

        boolean setComa = false;
        for (MyEntity a: list) {
            if (setComa) {
                queryText.append(","+a.getId());
            } else {
                queryText.append(a.getId());
                setComa = true;
            }
        }
        queryText.append(")");
        Query q = em.createQuery(queryText.toString());
        list = q.getResultList();
        return list.subList(0, list.size());
}

更新限制:

@Override
public List<MyEntity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) {

    List<MyEntity> list;

    Query q = em.createQuery(this.queryText);

    // Paginate
    q.setFirstResult(first); 
    q.setMaxResults(pageSize); 
    list = query.getResultList();

    return list.subList(0,list.size());
}
 类似资料:
  • 我已经阅读了跑道文档。我特别考虑了以下关于使用的声明: 此请求返回与上述相同的数据,您可以继续反复执行此操作,以保持应用程序的身份验证,而无需要求用户重新身份验证。 这是否意味着将无限期有效或过期: < li >签发后X天;或者 < li >最后一次使用它获取新的< code>access_token后的X天 编辑:请参阅此跑道线程,该线程提出相同的问题,但似乎没有给出任何关于Oauth2.0协议

  • 根据https://groups.google.com/forum/#!forum/oauth2-dev的介绍,现在就在这里。 无论我读多少书,我都无法理解谷歌OAuth2代币是如何工作的。阅读文档和许多其他地方表明,refresh_token不会过期,并且在access_token过期后使用。请参阅https://developers.google.com/accounts/docs/oauth

  • 问题内容: 在《有效的Java》一书中,乔希·布洛赫(Josh Bloch)说 StringBuffer在很大程度上已经过时,应该由非同步的实现’StringBuilder’代替 。 但是根据我的经验,我仍然看到StringBuffer类的广泛使用。为什么StringBuffer类现在已过时,为什么除了由于非同步而提高了性能之外,为什么StringBuilder比StringBuffer更受青睐?

  • 简要描述 有些时候,通用的绕过技巧并不可行,这个时候我们就得观察缺陷点的周围环境,想想其它办法咯。“猥琐绕过”与通用绕过不 同的是,它通用性小,往往只是特例。 详细说明 1. 直接看实例点: http://qzs.qq.com/qzone/v6/custom/custom_module_proxy.html#siDomain=1&g_StyleID=aaaaaaaaaa 2. 可以看出,这是一个

  • 简要描述 关于反射型的基本东西,暂时就到这啦,如果后面有什么好的 case,再做增补。最近,有些人会问到怎么绕过浏览器的 XSS 过滤 器,所以从这节开始,给出点绕过的例子。当然这些绕过浏览器的方法,不是万能的。不同浏览器,不同场景都会存在差异。满足场景 要求时,才可以使用。 此文给出的是一个来自 sogili 分享的 chrome 下绕过过滤器的方法,在腾讯某处 XSS 上的应用。 这一类都算是

  • 问题内容: 尝试将CS​​S3转换应用于幻灯片显示槽JavaScript时,我有些头疼。 基本上,JavaScript会获取幻灯片放映中的所有幻灯片,并将CSS类应用于正确的元素以提供良好的动画效果,如果不支持CSS3过渡,它将仅应用样式而无需过渡。 现在,我的“小”问题。所有工作都按预期进行,所有幻灯片都具有正确的样式,代码运行时没有错误(到目前为止)。但是,即使应用了正确的样式,指定的过渡也不