Bom dia !!!
Senhores estou tentando ler e persistir um arquivo com mais de 20000 linhas em um banco de dados (postgree) estou usando, o hibernate para isso mais a lógica esta toda correta só não sei se é a melhor forma maia na hora de persistir me é mostrado um erro de OutOfMemoryError, não estou querendo aumentar o tamanho do meu HEAP pois o tamanho deste arquivo não é estável pode ser que o próximo seja bem maior, então alguem saberia como eu posso solucionar este problema pois já procurei bastante na net mais não ajudou muito…
Abaixo estou colocando o meu código onde eu estou lendo e tentanto persistir o arquivo…
@Override
public void persistirTxt(InputStream is, GenericDao dao) throws ImportacaoException {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = "";
int index = 0;
ProcedimentoHabilitacao procedimentoHabilitacao = null;
/**
* Lista de todos os nrProcedimentoHobilitacao presentes no arquvo rl_prodimento_habilitacao.txt
*/
List<String> listNrProcedimentoHabilitacao = new LinkedList<String>();
try {
while ((line = br.readLine()) != null) {
procedimentoHabilitacao = new ProcedimentoHabilitacao();
listNrProcedimentoHabilitacao.add(line.substring(0, 18));
Integer nrGrHab = null;
if(!line.substring(14, 18).trim().equals("")){
nrGrHab = Integer.valueOf(line.substring(14, 18));
}
//Lista todos os ProcedimentoHabilitacao com base no nrGrupoHabilitacao
List<ProcedimentoHabilitacao> listProcedimentoHabilitacao = (List<ProcedimentoHabilitacao>) dao.listByQueryName("procedimentoHabilitacao.listProcedimentoHabilitacaoPorNrProcedimentoENrHabilitacaoENrGrupoHabilitacao", new Object[]{line.substring(0, 10), line.substring(10, 14), nrGrHab==null?0:nrGrHab});
//Lista os Procedimeto cadastradas p/ o nrProcedimento do arquivo
List<Long> listProcedimento = (List<Long>) dao.listByQueryName("procedimento.listCdProcedimentoPorNr", new Object[]{line.substring(0, 10)});
//Lista os Habilitacao cadastradas p/ o nrProcedimento do arquivo
List<Long> listHabilitacao = (List<Long>) dao.listByQueryName("habilitacao.listCdHabilitacaoPorNr", new Object[]{line.substring(10, 14)});
Procedimento procedimento = null;
Habilitacao habilitacao = null;
if (!listProcedimento.isEmpty()) {
procedimento = new Procedimento(listProcedimento.get(0));
}
if (!listHabilitacao.isEmpty()) {
habilitacao = new Habilitacao(listHabilitacao.get(0));
}
if (listProcedimentoHabilitacao.isEmpty()) {
procedimentoHabilitacao.setProcedimento(procedimento);
procedimentoHabilitacao.setHabilitacao(habilitacao);
procedimentoHabilitacao.setIdVigente(1);
procedimentoHabilitacao.setNrGrupoHabilitacao(nrGrHab);
dao.save(procedimentoHabilitacao);
} else {
procedimentoHabilitacao = listProcedimentoHabilitacao.get(0);
procedimentoHabilitacao.setProcedimento(procedimento);
procedimentoHabilitacao.setHabilitacao(habilitacao);
procedimentoHabilitacao.setIdVigente(1);
procedimentoHabilitacao.setNrGrupoHabilitacao(nrGrHab);
dao.update(procedimentoHabilitacao);
}
//Obtem o tamanho atual do heap
long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Tamanho atual do heap = " + heapSize + "\n");
//Obtem o tmanho máximo do heap
long heapMaxSize = Runtime.getRuntime().maxMemory();
System.out.println("Tamanho máximo do heap = " + heapMaxSize + "\n");
long metade = heapMaxSize / 2;
System.out.println("Metade do heap = " + metade+ "\n");
if(heapSize >= (metade / 2)){
System.out.println("Sleep..." + "\n");
Thread.sleep(50);
System.gc();
}
System.out.println("25% do heap = " + metade / 2 + "\n");
}
} catch (InterruptedException ex) {
Logger.getLogger(ProcessadorTxtProcedimentoHabilitacao.class.getName()).log(Level.SEVERE, null, ex);
} catch (ValidationException ex) {
throw new ImportacaoException("Erro na importação do arquivo Procedimento Habilitação!", ex);
} catch (IOException ex) {
throw new ImportacaoException("Erro na importação do arquivo Procedimento Habilitação!", ex);
}
}
Desde já agradeço…
[color=red][EDIT] inserido tags code[/color]