Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mapeamento de relacionamento de hibernação/aceleração de inserções em lote


A estratégia de geração de ID é fundamental para a inserção de lotes no Hibernate. Em particular, a geração de IDENTIDADE geralmente não funciona (observe que AUTO normalmente mapeia para IDENTITY também). Isso ocorre porque durante a inserção em lote o Hibernate tem um sinalizador chamado "requiresImmediateIdAccess" que informa se os IDs gerados são ou não necessários imediatamente; em caso afirmativo, o processamento em lote está desabilitado.

Você pode facilmente identificar isso nos logs no nível DEBUG quando diz "executando a inserção de identidade imediatamente" - isso significa que ele pulou o processamento em lote porque foi informado que os IDs gerados são necessários imediatamente após a inserção.

Estratégias de geração que normalmente fazem trabalho são TABLE e SEQUENCE, pois o Hibernate pode pré-gerar os IDs, permitindo assim a inserção em lote.

Uma maneira rápida de identificar se a inserção do lote funciona é ativar os logs no nível do DEBUG, pois o BatchingBatcher informará explicitamente o tamanho do lote que está sendo executado ("Executando o tamanho do lote:" + batchSize ).

Além disso, as propriedades a seguir são importantes para obter a inserção em lote. Não ouso dizer que eles são necessários, pois não sou especialista em Hibernate o suficiente para fazê-lo - talvez seja apenas minha configuração particular - mas, na minha experiência, eles eram necessários:
hibernate.order_inserts = true
hibernate.order_updates = true

Essas propriedades são muito mal documentadas, mas acredito que o que elas fizeram foi permitir que as instruções SQL INSERT e UPDATE fossem agrupadas adequadamente para execução em lote; Acho que essas podem ser as inserções de várias linhas que você procura. Não atire em mim se eu estiver errado nisso, estou lembrando de memória.

Eu também vou assumir que você definiu a seguinte propriedade; se não, isso deve servir como um lembrete:
hibernate.jdbc.batch_size = xx

Onde xx é o tamanho de lote desejado, naturalmente.