Mysql
 sql >> Database >  >> RDS >> Mysql

Mappatura delle relazioni di ibernazione/accelerazione degli inserimenti batch

La strategia di generazione dell'ID è fondamentale per l'inserimento batch in Hibernate. In particolare, la generazione dell'IDENTITÀ di solito non lavoro (notare che AUTO in genere esegue il mapping anche a IDENTITY). Questo perché durante l'inserimento batch Hibernate ha un flag chiamato "requiresImmediateIdAccess" che dice se gli ID generati sono immediatamente richiesti o meno; in tal caso, l'elaborazione batch è disabilitata.

Puoi facilmente individuarlo nei registri a livello di DEBUG quando dice "esecuzione immediata dell'inserimento dell'identità":ciò significa che ha saltato l'elaborazione batch perché è stato detto che gli ID generati sono necessari immediatamente dopo l'inserimento.

Strategie di generazione che in genere fanno lavoro sono TABLE e SEQUENCE, perché Hibernate può pre-generare gli ID, consentendo così l'inserimento batch.

Un modo rapido per capire se il tuo inserimento batch funziona è attivare i log a livello di DEBUG poiché BatchingBatcher ti dirà esplicitamente la dimensione del batch che sta eseguendo ("Executing batch size:" + batchSize ).

Inoltre, le seguenti proprietà sono importanti per ottenere l'inserimento batch. Non oso dire che siano necessari in quanto non sono abbastanza esperto di Hibernate per farlo - forse è solo la mia configurazione particolare - ma nella mia esperienza erano comunque necessari:

hibernate.order_inserts = true
hibernate.order_updates = true

Queste proprietà sono documentate piuttosto male, ma credo che ciò che hanno fatto sia stato consentire il raggruppamento corretto delle istruzioni SQL INSERT e UPDATE per l'esecuzione batch; Penso che questi potrebbero essere gli inserti a più righe che stai cercando. Non spararmi se sbaglio su questo, sto ricordando a memoria.

Andrò anche avanti e presumo che tu imposti la seguente proprietà; in caso contrario, questo dovrebbe servire come promemoria:

hibernate.jdbc.batch_size = xx

Dove xx è la dimensione del lotto desiderata, naturalmente.