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

Dvale forholdskortlægning/Gennemfør batchindsættelser

ID-genereringsstrategien er afgørende for batchindsættelse i Hibernate. Især IDENTITY-generering vil normalt ikke arbejde (bemærk, at AUTO typisk også er knyttet til IDENTITY). Dette skyldes, at Hibernate under batchindsættelse har et flag kaldet "requiresImmediateIdAccess", der siger, hvorvidt genererede ID'er er umiddelbart nødvendige eller ej; hvis det er tilfældet, er batchbehandling deaktiveret.

Du kan nemt få øje på dette i logfilerne på DEBUG-niveau, når der står "udfører identitetsindsættelse straks" - dette betyder, at den har sprunget batchbehandling over, fordi det blev fortalt, at genererede ID'er er påkrævet umiddelbart efter indsættelse.

Generationsstrategier, der typisk gør arbejde er TABLE og SEQUENCE, fordi Hibernate kan prægenerere ID'erne og derved tillade batch-indsættelse.

En hurtig måde at finde ud af, om din batch-indsættelse virker, er at aktivere logfiler på DEBUG-niveau, da BatchingBatcher eksplicit vil fortælle dig, hvilken batchstørrelse den udfører ("Udfører batchstørrelse:" + batchSize ).

Derudover er følgende egenskaber vigtige for at opnå batch-indsættelse. Jeg tør ikke sige, at de er påkrævet, da jeg ikke er nok en Hibernate-ekspert til at gøre det - måske er det bare min særlige konfiguration - men efter min erfaring var de nødvendige alligevel:

hibernate.order_inserts = true
hibernate.order_updates = true

Disse egenskaber er temmelig dårligt dokumenteret, men jeg tror, ​​at det, de gjorde, var at aktivere SQL INSERT- og UPDATE-sætningerne til at blive korrekt grupperet til batch-udførelse; Jeg tror, ​​at dette kan være de multi-række indsatser, du leder efter. Skyd mig ikke, hvis jeg tager fejl i dette, husker jeg fra hukommelsen.

Jeg vil også gå videre og antage, at du indstiller følgende egenskab; hvis ikke, bør dette tjene som en påmindelse:

hibernate.jdbc.batch_size = xx

Hvor xx er din ønskede batchstørrelse, naturligvis.



  1. Forbedre SQL INSERT-forespørgsel for at undgå sql-injektioner

  2. tilføje fødselsdagsbegivenheder i jQuery's fulde kalender hvert år

  3. Hvordan kan jeg bestemme installerede SQL Server-instanser og deres versioner?

  4. Spark Dataframes UPSERT til Postgres Table