我不知道为什么但是在我将PagingNavigator添加到我的Dataview之后,该页面第一次加载的速度慢了5秒。
我的数据提供者正在从数据库加载数据。但是,使用相同的数据提供者并只删除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());
}
更新(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 :(得分:1)
让我们看一下EstabelecimentosProvider
的代码。
我猜原因是你没有缓存结果。分页导航器需要知道数据的大小,我想这在您的实现中很昂贵。
答案 1 :(得分:0)
在正常情况下,表和带导航的表之间的唯一区别是tablesize方法调用。
InstaPontoWebController.get().buscarEstabelecimentosTotal()
这种方法有多长时间了?