Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Bulk Insert/Update com WebService Rest

Eu tenho uma aplicação Java desktop c/ DB MySQL rodando em 100 franquias da empresa a mais de 6 anos. Hoje na matriz precisamos de algumas informações do banco de dados das franquias. Estou desenvolvendo um Web Service Rest, utilizando Jersey, JPA e MySQL, para realizar essa integração.

A primeira vez que acontecer essa integração, a aplicação desktop vai enviar todos os registros de 3 tabelas diferentes. Não preciso de todas as informações que estão na aplicação local, preciso apenas (dados da empresa, dados dos clientes e produtos adquiridos pelos cliente), em média vai ser algo em torno de uns 3000 registros por filiais. Ainda estou verificando a melhor maneira de realizar este bulk insert para não ficar tão pesada as transações.

Depois disso, apenas 1 vez ao dia as franquias vão enviar p/ o WS apenas as novas alterações e novos registros dessas 3 tabelas.

No começo eu pensei em realizar o procedimento da seguinte maneira, quando o cliente realizar o Login na aplicação desktop:

1º - Buscar os dados da tabela empresa na franquia.

2º - Verifica se o código da franquia já existe no banco de dados do WS. Caso não existir, salvar, se existir atualizar apenas alguns dados.

3º - Buscar todos os clientes dessa franquia.

4º - Verificar se esses clientes já existem no banco de dados do WS. Caso não existir, salvar, se existir atualizar apenas alguns dados.

5º - Buscar todos os produtos que cada cliente da franquia adiquiriu na tabela cliente_produtos local.

6º - Recuperar o id de cada cliente do WS referente a franquia que esta realizando o procedimento e inserir ou atualizar na tabela cliente_produtos do WS.

Mas estou notando que estou solicitando muitas requisições, vou na base de dados do WS, busco X informação, volto e verifico na base de dados local, depois retorno novamente e assim por diante, registro por registro.

Eu nunca trabalhei com inserir e atualizar grandes volumes de informações, que precisam ser tratadas antes de inserir. Pensei também que esses vários inserts pode prejudicar o cache de primeiro nível, até estou pesquisando sobre Batch Processing p/ resolver esse problema.

Minhas dúvidas são as seguintes:

  • Qual o melhor procedimento que devo adotar nessa situação do bulk insert? Se essas verificações tem que ser implementadas manualmente cada uma ou se tem algo que ja faça esse tipo de verificação?

    • Depois que a franquia enviar todos os dados a primeira vez, as outras serão somente os novos dados ou as atualizações dos dados antigos. Gostaria de saber se existe uma maneira de realizar um monitoramento desse tipo, quando acontece qualquer mudança no banco de dados da franquia, mais específico essas 3 tabelas?

Sei que existe alguns frameworks que faz esse tipo de auditoria, pesquisei também sobre replicações. Mas minha situação eu preciso que as mudanças do lado das franquias, sejam mínimas e minha idéia era apenas atualizar o JAR da minha aplicação, com os metódos p/ a integração com o WS e a auditoria da base de dados local da franquia. Pois mudanças simples, mesmo orientando por telefone, da muito problema.

Estou meio perdido, pesquisando bastante e não encontrei nada ainda que seja uma melhor opção para este meu caso.

3 respostas

Oi André, pelo que você disse, você precisa apenas das 3 tabelas, não é possivel você manter as aplicações acessando o WS, apenas nessas 3 tabelas, assumindo que exista paginação na aplicação, as requisições serão mais especificas, o numero de requisição não seria massivo, dependendo da movimentação, talvez evitária tudo isso, sem grandes mudanças.

Espero não estar falando besteira, por ser aplicação desktop, já é por dispensar a conexão constante com a internet.

Obrigado Douglas pela resposta.

Sim, existe paginação na aplicação, realmente pode ser uma solução. Vou analisar e fazer alguns testes e ver como fica.

E na primeira vez que que for realizar o bulk insert a melhor estratégia é utilizar o Batch Processing para evitar que sobrecarregar o cache do hibernate?

solução!

André, não tenho experiencia com isso, mas parece que seja em bulk ou batch, você precisa fazer a limpeza do cache em certos intervalos de tempo para evitar problemas com memoria, na documentação parece ter esses valores.

Dê uma olhada nesses links, deve ajudar

https://abramsm.wordpress.com/2008/04/23/hibernate-batch-processing-why-you-may-not-be-using-it-even-if-you-think-you-are/

https://books.google.com.br/books?id=PVQnCgAAQBAJ&pg=PA188&lpg=PA188

http://vladmihalcea.com/2015/03/18/how-to-batch-insert-and-update-statements-with-hibernate/

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software