Hibernate - Teste de performance

3 respostas
F

Boa tarde,

Estou testando a performance do Hibernate e tem uma coisa me deixando intrigado. Estou usando o código abaixo para incluir lotes de 1.000, 10.000 e 100.000 registros em uma tabela de clientes:

ClienteDAO clienteDAO = new ClienteDAO();

Session s = HibernateUtil.getSessionFactory().openSession();

s.beginTransaction();

clienteDAO.setSession(s);

Cliente c;

System.out.println("Início " + new Date(System.currentTimeMillis()));

for (int i = 0; i < 100000; i++) {

c = new Cliente();

c.setclienteDAO.makePersistent©;

}

System.out.println("Término da inclusão " + new Date(System.currentTimeMillis()));

s.getTransaction().commit();

System.out.println("Término do commit " + new Date(System.currentTimeMillis()));

Vejam os resultados:

Para 1.000 registros (3 segundos)

Início Wed Apr 04 14:49:09 GMT-03:00 2007
Término da inclusão Wed Apr 04 14:49:11 GMT-03:00 2007
Término do commit Wed Apr 04 14:49:12 GMT-03:00 2007

Para 10.000 registros (22 segundos)

Início Wed Apr 04 14:49:29 GMT-03:00 2007
Término da inclusão Wed Apr 04 14:49:45 GMT-03:00 2007
Término do commit Wed Apr 04 14:49:51 GMT-03:00 2007

Para 100.000 registros (164 segundos)

Início Wed Apr 04 14:38:58 GMT-03:00 2007
Término da inclusão Wed Apr 04 14:41:15 GMT-03:00 2007
Término do commit Wed Apr 04 14:45:42 GMT-03:00 2007

O que estou achando estranho, e que fica bem claro no exemplo de 100.000 registros, é o tempo que demora para processar o commit. Ele leva 77 segundos para executar “clienteDAO.makePersistent©” para os 100.000 registros, mas depois leva 87 segundos para fazer o commit. Nestes 87 segundos, o uso de CPU do meu servidor de banco de dados é de 3% (Firebird).

As minhas dúvidas são:

  • Isso é esperado?
  • O Hibernate possui seu próprio controle de transações, e depois na hora do commit abre uma transação no banco e grava os registros um a um?
  • Existe uma forma de melhorar esta performance?
  • O Hibernate costuma ser indicado para, além de operações de CRUD, operações em lote?

Atenciosamente,

Fabiano

3 Respostas

alberto_ribeiro

Olá Fabiano, então fiquei vendo os dados que você colocou neste post e decidi testar e cheguei ao seguinte resultado, usando hibernate annotations com mysql

com 1000 = 1 segundo

Wed Apr 04 21:46:24 BRT 2007
Wed Apr 04 21:46:25 BRT 2007

com 10000 = 3 segundos

Wed Apr 04 21:47:56 BRT 2007
Wed Apr 04 21:47:59 BRT 2007

com 100000 = 25 segundos

Wed Apr 04 21:40:20 BRT 2007
Wed Apr 04 21:40:45 BRT 2007

meu teste foi esse:

public class TesteDAO extends TestCase {

    private Session session;

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        session = HibernateUtil.getSession();
    }

    public void testSalvarCliente() {
        System.out.println(new Date());
        Transaction tx = session.beginTransaction();

        Cliente cliente = null;

        for (int i = 1; i < 10000; i++) {
            cliente = new Cliente();
            cliente.setId(i);
            cliente.setNome("Alberto");
            session.save(cliente);
        }

        tx.commit();
        System.out.println(new Date());
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();

        session.close();
    }

}

A diferença entre meu teste e seu foi muito grande, acredito que seja as configurações da máquina, ou o tipo do banco de dados…

A respeito de controle de transações acredito eu que o hibernate não faz isso, mas tem o spring que faz muito bem e é bem legal…

espero ter ajudado de alguma forma…

[]'s

plentz

fabianobonin:
As minhas dúvidas são:

  • Isso é esperado?

Se mal configurado, sim, é esperado que o Hibernate acabe ficando lento.

Mais ou menos isso.

Sim, , você deve usar os recursos de batch que o hibernate oferece,
http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#batch

e escolher corretamente a estratégia de fetch
http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#performance-fetching-custom

Sim.

F

Muito interessantes os artigos. Obrigado pela dica.

Criado 4 de abril de 2007
Ultima resposta 15 de abr. de 2007
Respostas 3
Participantes 3