2017-08-24 1 views
0

Ich weiß nicht warum, aber nachdem ich die PagingNavigator hinzugefügt habe, wurde die Seite zum ersten Mal 5 Sekunden langsamer zum Laden.Wicket: Dataview mit PagingNavigator

Mein Datenprovider lädt die Daten aus der Datenbank. Mit dem gleichen Datenprovider und dem Entfernen der PagingNavigator wird die Seite jedoch ca. 5 Sekunden schneller geladen. Hier

ist der Code:

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 Implementierung):

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-Implementierung):

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

ist dataprovider kompatibel mit Paging-Konzept? –

+0

Ich denke ja, es ist kompatibel. –

Antwort

1

Lassen Sie uns den Code EstabelecimentosProvider sehen.

Ich vermute der Grund ist, dass Sie die Ergebnisse nicht zwischenspeichern. Der Paging-Navigator muss die Größe der Daten kennen und ich schätze, dass dies in Ihrer Implementierung teuer ist.

+0

Vielleicht. Ich habe den EstabelecimentosProvider-Code und auch den EstabelecimentoDao-Code eingegeben, der die Abfrage in der Datenbank ausführt. Ist es richtig ? –

+0

Debugging der Code, bemerkte ich die teure Methode ist der "onRender" von PagingNavigator. –

+0

Was genau ist teuer darin? –

0

Im Normalfall ist der einzige Unterschied zwischen Tabelle und Tabelle mit Navigation der Aufruf der Methode tabellarisieren.

InstaPontoWebController.get().buscarEstabelecimentosTotal() 

Wie lange funktioniert diese Methode?