Pessoal, minha duvida é a seguinte, tenho uma consulta no banco onde me eh retornado uma lista com mais de 5000 registros… consigo pegar todos os registros e talz, mas esta demorando muito… e estou tendo q usar uma lista auxiliar para poder carregar o objeto pois ele nao esta conseguindo carregar todos os registros… gostaria de saber se alguem tem alguma ideia de como melhorar isso…
abaixo segue o metodo
public Collection<OSClienteSMP> findListaOSSMP(String tipoOS) {
osClienteSMPDAO.deleteComErro(tipoOS);
Collection<OSClienteSMP> lista = osVitriaDAO.findListaOSSMPImportar(tipoOS);
Collection<OSClienteSMP> listaux;
Collection<OSClienteSMP> listaRet = new LinkedList<OSClienteSMP>();
while (lista.size() != 0) {
listaux = new LinkedList<OSClienteSMP>();
for (OSClienteSMP os : lista) { [b] aqui seria melhor um iterator?[/b]
if (listaux.size() < 1000) {
listaux.add(os);
} else
break;
}
lista.removeAll(listaux);
atualizaDiferencaOSClienteSMP(tipoOS, OSClienteSMP.SMP, listaux);
findDetalhesOMS(tipoOS, listaux);
findDetalhesSac(tipoOS, listaux);
osClienteSMPDAO.saveOrUpdateOS(listaux);
listaRet.addAll(listaux);
listaux = null;
System.gc();
}
O enhanced-for na verdade é um iterator mais “bonitinho”, criado para facilitar a vida dos programadores (a performance é a mesma, creio eu).
Seu laço for está meio confuso… e você tem certeza que precisa de duas listas? Estou fazendo uns testes de performance com LinkedList e coloquei 500 mil Strings numa lista… (levou 9,6 segundos para colocar e depois imprimir todos os valores). Se está demorando muito o problema pode estar em outro lugar.
Use o forEach esse for: apartir do Java 5 o recurso esta disponível e mas rápido que seu antecessor Iterator não precisa de Cast e o codigo fica mais limpo:
O foreach utiliza o iterator, então a performance é a mesma. Se for utilizar o iterator, você pode parametrizá-lo, de forma a não precisar fazer casting.
Quanto à lentidão, se a ordem dos elementos não for importante, tente utilizar uma implementação da interface Set, como HashSet. Se for, tente um LinkedHashSet, lembrando que num Set não são permitidos elementos repetidos.
Adicionar elementos num Set pode ser mais lento que numa List, uma vez que na List, basta colocar o valor na primeira posição não ocupada, enquanto que no Set, deve-se garantir que não existe o mesmo objeto.
Ao resgatar elementos, em geral ocorre o contrário (Set é mais rápida). Mas no final das contas, o List vale mais a pena.