Migrar registros x Java heap space

7 respostas
wilsontads

Olá, tenho o código abaixo e venho enfrentando um problemão em tratando-se de desempenho. já adicionei o parametro (?-Xmx1280M?) p/ ver se resolve, só que aqui acolá volto a ter problema, de acordo com a quantidade de registros inseridas:
talvez o código abaixo apresente uma falha que eu não consiga ver, em fim..

//ou eu tenho um heap na consulta, ou durante os inserts.
Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
private void migrar(Tabela tabela) throws Exception {

        connectionDbIn = new ConnETL(tabela.getBancoIn());
        connectionDbOut = new ConnETL(tabela.getBancoOut());
        try {

            stmtIn = connectionDbIn.getStatement();
            stmtOut = connectionDbOut.getStatement();

            //Consulta retorna ~3k de registros do banco de entrada.
            rsIn = stmtIn.executeQuery(tabela.getSqlSelect());



            //exclui todos os registros do banco de saída
                stmtOut.executeUpdate(" delete from " + tabela.getNome());


            camposLocal = tabela.getCampos();
            String sqlinsercao = "insert into bancoOut(COD_TITULO, COD_FILIAL_ESTOQUE, COD_FILIAL_FATURAMENTO, COD_FILIAL_PEDIDO, COD_CLIENTE, COD_VENDEDOR, COD_USUARIO, COD_COND, TIPO_VENDA)values (?, ?, ?, ?, ?, ?, ?, ?, ?)";
            int x = 0, z = 0;			
            ps = connectionDbOut.getPrepareStatement(sqlinsercao);
            System.out.println("Insert");
            while (rsIn.next()) {
                int i = 1;
                for (i = 1; i <= camposLocal.size(); i++) {
                    ps.setObject(i, rsIn.getObject(camposLocal.get(i - 1).getNome()));
                }
                ps.addBatch();
                x++;
                c++;
                z++;


                if (x == 500) {
				connectionDbOut.commit();
                    x = 0;
                }
                if (z == 50) {
                    ps.executeBatch();
                    z = 0;
                }

            }
			connectionDbOut.commit();
			
        } catch (Exception ex) {
            connectionDbOut.rollback();
            throw new Exception("migrar(Tabela)|" + ex.getMessage());
        }
    }

7 Respostas

ViniGodoy

E desde quando isso é assunto de Java Básico? Ou sua dúvida é na sintaxe da linguagem? :slight_smile:
Tópico movido para o fórum de persistência.

Outra coisa, não estou vendo no seu código onde você fecha statements e conexões. Eles estão sendo fechados adequadamente?
Uma boa ideia seria usar um framework que gerencie isso para você, como o Spring.

wilsontads

Estão sim, erros do tipo StackOverflowError também são constantes

ViniGodoy

Pois é, mas pq nesse código não tem nenhum close??

Outra coisa, após o ps.executeBatch(), faltou chamar ps.clearBatch(). A documentação do executeBatch() não diz que a lista será limpa automaticamente.

wilsontads

Então Vini, antes de executar os inserts, eu já tenho a exceção na query.
e estou executando com os parametros: -Xms128m -Xmx1024m

Consulta Exception in thread "Thread-3" java.lang.OutOfMemoryError: Java heap space

ViniGodoy

Já tentou usar um profiler para ver onde a memória está sendo realmente gasta?

wilsontads

Resolvi apensar fazer a consulta, em uma tela separada, obtive a mesma excessão.
Talvez a imagem abaixo pode ajudar

wilsontads

Quando faço a consulta com o mysql query brownser, eu tenho a seguinte exceção:

Criado 6 de setembro de 2012
Ultima resposta 10 de set. de 2012
Respostas 7
Participantes 2