2017-08-24 51 views
0

我不知道爲什麼,但在我將PagingNavigator添加到我的Dataview後,頁面首次加載速度慢了5秒。Wicket:Dataview with PagingNavigator

我的數據提供者正在加載數據庫中的數據。但是,使用相同的數據提供程序並刪除PagingNavigator,頁面加載速度大約快5秒。

下面是代碼:

private void initScreen() { 
    feedbackPanel = new FeedbackPanel(Constants.FEEDBACK_CONST); 
    add(feedbackPanel.setOutputMarkupId(true)); 

    form = new Form<Void>(FORM_CONST); 

    prepareDataView(); 

    form.add(estabelecimentoDataView); 
    form.add(new PagingNavigator(NAVIGATOR_CONST, estabelecimentoDataView)); 

    add(form);  
} 

private void prepareDataView() {   
    dataProvider = new EstabelecimentosProvider(); 
    /** dataview que lista as agencias */ 
    estabelecimentoDataView = new DataView<Estabelecimento>(ROWS_CONST, dataProvider) { 

     /** 
     * Serial id 
     */ 
     private static final long serialVersionUID = -3327582763351095154L; 

     @Override 
     protected void populateItem(Item<Estabelecimento> item) { 
      final Estabelecimento estab = item.getModelObject(); 

      AjaxLink<Void> link = new AjaxLink<Void>(LINK_CONST) { 

       /** 
       * Serial id 
       * , tipoEmpresa.getDescricao() 
       */ 
       private static final long serialVersionUID = -1668530681964357458L; 

       @Override 
       public void onClick(AjaxRequestTarget target) { 
        selectedEstabelecimento = estab; 
        ParamsWrapper params = new ParamsWrapper(); 
        params.put(Constants.KEY_CONST, estab.getId()); 
        PageManager.changePage(this, PageManager.ESTABELECIMENTOS_ALTERAR_PAGE, params); 
       } 

      }; 
      link.add(new Label(NOME_CONST, new PropertyModel<String>(estab, "nome"))); 

      item.add(link);        

      item.add(new Label(ENDERECO_CONST, new PropertyModel<String>(estab, "endereco"))); 
      item.add(new Label(BAIRRO_CONST, new PropertyModel<String>(estab, "bairro"))); 
      item.add(new Label(CIDADE_CONST, new PropertyModel<String>(estab, "cidade"))); 
      item.add(new Label(UF_CONST, new PropertyModel<String>(estab, "uf"))); 
      item.add(new AjaxButton(DELETE_CONST) {     
       /** 
       * Serial id 
       */ 
       private static final long serialVersionUID = 1762220739285945720L; 

       @Override 
       protected void onSubmit(AjaxRequestTarget target) { 
        // TODO Auto-generated method stub 
        super.onSubmit(target); 
        selectedEstabelecimento = estab; 
        //removeConfirmationMessage(Constants.REMOVER_AGENCIA_CONST + selectedAgencia.getRazaoSocial() + "?", target); 

       } 

      }); 
     }  
    };  

    estabelecimentoDataView.setOutputMarkupId(true);   
    estabelecimentoDataView.setItemsPerPage(Constants.ITEMS_PER_PAGE); 
    estabelecimentoDataView.setItemReuseStrategy(ReuseIfModelsEqualStrategy.getInstance()); 


} 

UPDATE(EstabelecimentosProvider實現):

public class EstabelecimentosProvider implements IDataProvider<Estabelecimento> { 

/** 
* Serial id 
*/ 
private static final long serialVersionUID = 1L; 

@Override 
public Iterator<? extends Estabelecimento> iterator(long first, long count) { 
    return InstaPontoWebController.get().buscarEstabelecimentos(first, count).iterator(); 
} 

@Override 
public long size() { 
    return InstaPontoWebController.get().buscarEstabelecimentosTotal(); 
} 

@Override 
public IModel<Estabelecimento> model(Estabelecimento object) { 
    return new LoadableDetachableModel<Estabelecimento>() { 

     /** 
     * Serial id 
     */ 
     private static final long serialVersionUID = 1L; 

     @Override 
     protected Estabelecimento load() { 
      return InstaPontoWebController.get().buscarEstabelecimento(object.getId()); 
     } 
    }; 
} 

} 

UPDATE(DAO實現):

public class EstabelecimentoDao { 

/*** 
* Usado para registrar todas chamadas da classe. 
*/ 
Logger log = LogManager.getLogger(EstabelecimentoDao.class); 

/** 
* Pesquisa por todas os estabelecimentos do sistema. 
* @return uma lista de estabelecimentos. 
*/ 
public final List<Estabelecimento> buscarEstabelecimentos() { 
    return EntityManagerHelper.getEntityManager().createQuery("FROM Estabelecimento", 
      Estabelecimento.class).getResultList(); 
} 


/** 
* Retorna o status que representa sem uso no sistema. 
* @param empresa a empresa em uso. 
* @return os estabelecimentos sem uso para a empresa passada. 
*/ 
public List<Estabelecimento> buscarEstabelecimentosSemUso(Empresa empresa) { 
    TypedQuery<Estabelecimento> query = null; 
    List<Integer> estabelecimentos = prepareList(empresa.getPontos()); 
    List<Integer> ramosAtividade = prepareList(empresa.getRamosAtividade()); 
    if (estabelecimentos.size() > 0 && ramosAtividade.size() > 0) { 
     query = EntityManagerHelper.getEntityManager().createQuery(
       "From Estabelecimento e where e.id not IN :filter and e.ramoAtividade.id IN :ids and e.ativo = :key Order by e.nome ASC", 
       Estabelecimento.class); 
     query.setParameter(Constants.FILTER_CONST, estabelecimentos); 
     query.setParameter(Constants.IDS_CONST, ramosAtividade); 
    } else if (ramosAtividade.size() > 0) { 
     query = EntityManagerHelper.getEntityManager().createQuery(
       "From Estabelecimento e where e.ramoAtividade.id IN :ids and e.ativo = :key Order by e.nome ASC", 
       Estabelecimento.class); 
     query.setParameter(Constants.IDS_CONST, ramosAtividade); 
    } else { 
     query = EntityManagerHelper.getEntityManager().createQuery(
       "From Estabelecimento e where e.ativo = :key Order by e.nome ASC", Estabelecimento.class); 
    } 

    query.setParameter(Constants.KEY_CONST, true); 

    return query.getResultList(); 
} 


/** 
* Prepara lista de ids dos ramos de atividades. 
* @param ramosAtividade os ramos de atividades. 
* @return a lista. 
*/ 
private List<Integer> prepareList(Set<RamoAtividade> ramosAtividade) { 
    List<Integer> list = new ArrayList<Integer>(); 
    for (RamoAtividade ramoAtividade : ramosAtividade) { 
     list.add(ramoAtividade.getId()); 
    } 
    return list; 
} 


/** 
* Prepara a lista de ids de pontos. 
* @param pontos a lista de pontos. 
* @return a lista de id de pontos. 
*/ 
private List<Integer> prepareList(List<Ponto> pontos) { 
    List<Integer> list = new ArrayList<Integer>(); 
    for (Ponto ponto : pontos) { 
     list.add(ponto.getEstabelecimento().getId()); 
    } 
    return list; 
} 


/** 
* Retorna os estabelecimentos sem uso no sistema. 
* @return os estabelecimentos sem uso. 
*/ 
public List<Estabelecimento> buscarEstabelecimentosSemUso(List<Ponto> pontos) { 
    TypedQuery<Estabelecimento> query = null; 
    if (pontos.size() > 0) { 
     query = EntityManagerHelper.getEntityManager().createQuery("From Estabelecimento e where e.id not IN :filter and e.ativo = :key Order by e.nome ASC", 
      Estabelecimento.class); 
     List<Integer> estabelecimentos = prepareList(pontos); 
     query.setParameter(Constants.FILTER_CONST, estabelecimentos); 
    } else { 
     query = EntityManagerHelper.getEntityManager().createQuery("From Estabelecimento e where e.ativo = :key Order by e.nome ASC", 
       Estabelecimento.class); 
    }  

    query.setParameter(Constants.KEY_CONST, true); 

    return query.getResultList(); 
} 


/** 
* Retorna os estabelecimentos em uso no sistema. 
* @return os estabelecimentos em uso. 
*/ 
public List<Estabelecimento> buscarEstabelecimentosEmUso(List<Ponto> pontos) { 
    TypedQuery<Estabelecimento> query = null; 
    List<Estabelecimento> result = null; 
    if (pontos.size() > 0) { 
     query = EntityManagerHelper.getEntityManager().createQuery(
       "From Estabelecimento e where e.id IN :filter and e.ativo = :key Order by e.nome ASC", 
       Estabelecimento.class); 
     List<Integer> estabelecimentos = prepareList(pontos); 
     query.setParameter(Constants.FILTER_CONST, estabelecimentos); 
     query.setParameter(Constants.KEY_CONST, true); 
     result = query.getResultList(); 
    } else { 
     result = new ArrayList<Estabelecimento>(); 
    } 

    return result; 
} 


/** 
* Retorna os estabelecimentos inativos no sistema. 
* @return os estabelecimentos inativos. 
*/ 
public List<Estabelecimento> buscarEsetabelecimentosInativos() { 
    TypedQuery<Estabelecimento> query = EntityManagerHelper.getEntityManager().createQuery("From Estabelecimento e where e.ativo = :key Order by e.nome ASC", 
      Estabelecimento.class); 
    query.setParameter(Constants.KEY_CONST, false); 

    return query.getResultList(); 
} 

/** 
* Procura um estabelecimento pelo identificador. 
* @param id o identificador do estabelecimento. 
* @return o estabelecimento ou null se nao for encontrado. 
*/ 
public Estabelecimento buscar(Integer id) {  
    return EntityManagerHelper.getEntityManager().find(Estabelecimento.class, id);  
} 


/** 
* Retorna lista de estabelecimentos com nome parecido com o texto. 
* @param texto o filtro a ser usado no nome. 
* @return a lista de estabelecimentos encontrados 
*/ 
public List<Estabelecimento> buscarEstabelecimentos(String texto) { 
    TypedQuery<Estabelecimento> query = EntityManagerHelper.getEntityManager().createQuery(
      "From Estabelecimento e where UPPER(e.nome) LIKE UPPER(:filter) and e.ativo = true Order by e.nome ASC", 
      Estabelecimento.class); 
    query.setParameter(Constants.FILTER_CONST, "%" + texto + "%"); 
    return query.getResultList(); 
} 


/** 
* Retorna o total de estabelecimentos. 
* @return total de estabelecimentos. 
*/ 
public long buscarTotal() { 
    TypedQuery<Long> query = EntityManagerHelper.getEntityManager().createQuery(
      "SELECT count(e) FROM Estabelecimento e", 
      Long.class); 
    return query.getSingleResult(); 
} 


/** 
* Faz a paginacao nos estabelecimentos cadastrados. 
* @param first o offset inicial 
* @param count a quantidade da paginacao (tamanho) 
* @return a lista baseada nos argumentos passados. 
*/ 
public List<Estabelecimento> buscarEstabelecimentos(int first, int count) { 
    TypedQuery<Estabelecimento> query = EntityManagerHelper.getEntityManager().createQuery(
      "From Estabelecimento e Order by e.nome ASC", 
      Estabelecimento.class); 
    query.setFirstResult(first); 
    query.setMaxResults(count);  
    return query.getResultList(); 
} 
} 
+0

是dataprovider與分頁概念兼容嗎? –

+0

我認爲是的,它是兼容的。 –

回答

1

讓我們看到了EstabelecimentosProvider代碼。

我想原因是你不緩存結果。分頁導航器需要知道數據的大小,我想這在實現中會很昂貴。

+0

也許吧。我已經建立了EstabelecimentosProvider代碼,以及在數據庫中執行查詢的EstabelecimentoDao代碼。這樣對嗎 ? –

+0

調試代碼時,我注意到昂貴的方法是pagingNavigator的「onRender」。 –

+0

究竟是什麼昂貴的呢? –

0

在正常情況下,表和導航之間的唯一區別就是tableize方法調用。

InstaPontoWebController.get().buscarEstabelecimentosTotal() 

此方法工作多長時間?