1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Erro de alocação de memória utilizando o hibernate

Estou criando uma aplicação para realizar a conversão de um banco de dados Firebird para um banco postgres. Nesta aplicação utilizo o hibernate para fazer a persistência dos dados no postgres. Meu problema ocorre quando tenho uma quantidade massiva de dados a serem convertidos.

Ex.: Tenho uma tabela de clientes no Firebird com aprox. 100.000 registros. Ao converter aprox. 23.000 clientes o aplicativo trava exibindo uma mensagem que diz que não foi possível alocar memória do sistema operacional.

Para tentar solucionar este problema estou recuperando do banco de dados Firebird 7.000 retistros de cada vez, e após converter estes 7.000 chamo os métodos .flush() e .clear() da session do hibernate. Entretanto, após converter os 7.000 registros e chamar os métodos .flush() e .clear(), a memória é preenchida com aprox. 100 MB por vez.

Segue um exemplo do código.

public Integer valida(JProgressBar barraProgresso, TextArea memoHistorico) {
        PersistentImpl pojoGeneric;

        int totalErros = 0;

        barraProgresso.setValue(0);
        barraProgresso.setMaximum(totalRegistrosDelphi(getNomeTabelaDelphi()));

        int totalRegistros = totalRegistrosDelphi(getNomeTabelaDelphi());

        try {
            for (int salto = 0; salto < totalRegistros; salto += 7000) {
                ResultSet rs = this.buscaRegistrosDelphi(salto);                
                while (rs.next()) {
                    try {
                        pojoGeneric = null;
                        pojoGeneric = preencheDados(rs, memoHistorico, pojoGeneric, TOperacao.Validacao);
                        genericBO.inclui(pojoGeneric);
                        gravarNovoCodigo(pojoGeneric, rs);
                        pojoGeneric = null;
                    } catch (ValidationException e) {
                        totalErros++;

                        if (e.getMensagens().contemAlertas()){
                            for(String mensagem : e.getMensagens().getAlertas()){
                                memoHistorico.append("Alerta: " + mensagem+ "\n");
                            }
                        }
                        if (e.getMensagens().contemErros()){
                            for(String mensagem : e.getMensagens().getErros()){
                                memoHistorico.append("Erro: " + mensagem+ "\n");
                            }
                        }
                    } catch (Exception e) {
                        totalErros++;
                        memoHistorico.append("Erro ao validar cliente: " + e.getMessage());
                        getLogger().debug("Erro ao validar cliente: " + e);                        
                    }

                    if (this.contemAlerta) {
                        AlertUtil.incTotalAlertas();
                    }

                }
                rs = null;
                WorkerConversao.session.flush();
                WorkerConversao.session.clear();
            }

        } catch (Exception e) {
            memoHistorico.append("Ocorreu um erro ao tentar validar a tabela: " + getNomeTabelaDelphi()+ "\n Motivo: "+e.getMessage()+".\n");
            getLogger().debug("Ocorreu um erro ao tentar validar a tabela: " + getNomeTabelaDelphi()+ "\n Motivo: "+e.getMessage()+".\n");
        }

        return totalErros;

    }
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate conversão memória ou faça a sua própria pergunta.