Importando grande quantidade de dados Olá, estou fazendo a migração dos dados do sistema antigo para o que estou desenvolvendo com o Adianti. Porém é um quantidade bem grande de dados, o que torna a importação lenta e também em determinado momento dá o seguinte o erro: "Connection failed" e não insere todos os dados. Segue o método que insere os dados de cliente: ...
BB
Importando grande quantidade de dados  
Olá,

estou fazendo a migração dos dados do sistema antigo para o que estou desenvolvendo com o Adianti. Porém é um quantidade bem grande de dados, o que torna a importação lenta e também em determinado momento dá o seguinte o erro: "Connection failed" e não insere todos os dados.

Segue o método que insere os dados de cliente:
<?phpprivate function salvaCliente($dados, $prf_codigo)    {        foreach($dados as $linha => $valores)        {            try            {                $pessoa = $this->buscaPessoa($valores["pes_cpfcnpj"], $prf_codigo);                if($pessoa == null)//não achou o cadastro de pessoa                {                    $pessoa = $this->salvaPessoa($valores, $prf_codigo);                }                                unset($valores["cln_codigo"]);                TTransaction::open('conecta');                $cliente = new Cliente;                $cliente->fromArray($valores);                $cliente->pes_codigo = $pessoa->pes_codigo;                $cliente->store();                TTransaction::close();            }            catch (Exception $e)            {                $log = fopen("tmp/importacao/log_cliente.txt", "a");                $l = $linha + 2;                $escreve = fwrite($log, $e->getMessage() . " -> Erro ao salvar cliente com CPF/CNPJ: " . $valores["pes_cpfcnpj"]. " - Linha {$l}" . " \r\n");                fclose($log);                TTransaction::rollback();            }        }    }?>


Já tentei abrir e fecha a transação a cada 500 registros, mas não funcionou.
Alguém sabe uma alternativa?

Obrigada

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (6)


NR

Bruna, verifique os logs do apache e do banco de dados para ver se aparece alguma coisa. Eu imagino que possa ser timeout do php. Faça um teste usando o comando abaixo no começo do processo:
<?phpset_time_limit(0); ?>

E eu usaria somente uma transação, aberta no início do processo e fechada após a inserção do último item.
BB

Obrigada Nataniel, o set_time_limit(0); funcionou, não recebo mais o erro.

Tentei utilizar somente uma transação, coloquei a abertura e o fechamento fora do foreach, e removi o rollback dentro do bloco catch, pois senão ele dá rollback em todas as inserções e não só na que deu erro e ainda fecha a transação. Porém, nos meus logs aparece muitas vezes a seguinte mensagem:

SQLSTATE[25P02]: In failed sql transaction: 7 ERROR: current transaction is aborted, commands ignored until end of transaction block.

O que poder ser?

E mesmo com uma única transação está lento, teria uma forma de otimizar?

NR

Esse erro ocorre quando se tenta executar uma instrução no banco de dados após algum erro anterior. Até ser feito o rollback da transação, qualquer instrução vai retornar essa mensagem.

"Tentei utilizar somente uma transação, coloquei a abertura e o fechamento fora do foreach, e removi o rollback dentro do bloco catch, pois senão ele dá rollback em todas as inserções..."
Esse é o funcionamento esperado da transação, ou tudo ou nada.

Para otimização, sugiro usar conexão manual(adianti.com.br/framework_files/tutor/index.php?class=ManualConnectio) e fazer inserts em lote. Ex:
INSERT INTO tbl_name
(a,b,c)
VALUES
(1,2,3),
(4,5,6),
(7,8,9);
A quantidade de itens em "VALUES" vai depender da sua configuração. Sugiro testar com 100, 200, 500 e ver como se comporta.

Outra possibilidade é usar a classe TDatabase(https://www.adianti.com.br/api-framework-database-TDatabase), ela tem funções com a mesma finalidade.
BB

Certo, irei modificar e ver como se comporta.

Obrigada Nataniel.
VP

olá Bruna, boa tarde!

Eu tenho uma aplicação (desktop com postgreSQL) que possui uma rotina de importação de dados com grande número de registros. Hoje faço importação de SPED FISCAL, CONTRIBUIÇÕES e XML.
Tive dificuldades com tempo de importação, mas hoje estou importando com bastante agilidade.

Caso queira trocar idéia, segue meu contato.

Valdiney
(67) 9.9636-5580 (zap)
email: sistemas.vlp@gmail.com

BB

Oi Valdiney,

gostaria sim, preciso tornar esse processo mais eficiente. Entrarei em contato.

Obrigada.