[Resolvido] JPA inserts performance

Prezados,

Atualmente eu tenho um objeto devidamente mapeado com JPA; Eu faço cerca de 12000 o insert desse objeto,
no principio os inserts são rapidissimos, mas a velocidade dos inserts decai conforme eu vou fazendo inserts.

Por gentileza, como mantenho um velocidade continua usando JPA?

Nao use JPA, evite overhead.

1 curtida

Manda o código da forma que você está pegando esses objetos e persistindon no banco com JPA.

Amigo, desculpa minha inteligencia, mas o problema da performance ocorre porque a aplicação guarda no cache do hibernate os 12000 inserts e dá o commit só no fim, correto?

Se sim, eu preciso necessariamente transcrever meu código para SQL nativo? Existe algum mecanismo para fazer o comitê a cada 500 inserts, por exemplo?

Amigo, segue o código

		objetoA objA = objetoARepository(objetoB, objetoC);

		if (objA == null) {

			objA = new objetoA();
		}


		objA.setObjetoB(objetoB);
		objA.setPropriedadeA(valorA);
		objA.setPropriedadeB(objetoC);

		objA = objetoARepository.merge(objA);

		if (objetoB.getObjetosA() == null) {

			objetoB.setObjetosA(new HashSet<ObjetoA>());
		}

		objetoB.getObjetosA().add(objA);

		objetoBRepository.merge(objetoB);

Por favor, me ajude a tornar o código mais perfomatico.

Por causa do cache principalmente, que pro seu caso parece ser um recurso inútil, está consumindo RAM sem necessidade pro usuário.

Seguindo JPA nao sei, mas Hibernate puro sei que dá pra trabalhar sem cache, pesquise por statelessesion já que você tem essa vontade de usar Hibernate. Exemplo: http://codereverse.blogspot.com.br/2012/02/hibernate-melhorando-performance-com.html

Quem programa o momento do commit é você mesmo.

O mecanismo é simplesmente você programar um contador. Não precisa de overengineering pra fazer algo tao simples.

1 curtida

Dá para fazer algo do tipo:

int contador = 1;

while(<alguma-coisa>) {
    SuaClasse objA = // monta objA;

    if(contador % 100 == 0) {
        persistencia.flush();
        persistencia.clear();
    }

    persistencia.merge(objA);
    contador++;
}

Esse exemplo irá limpar o cache do JPA a cada 100 objetos persistidos.

1 curtida

Amigos, muito obrigado pelas dicas. Eu não conseguiria sem a ajuda de vocês dois.

1 curtida