Batchverwerking in JDBC

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Inleiding

Java Database Connectivity (JDBC) is een Java-API die wordt gebruikt voor interactie met databases. Batchverwerking groepeert meerdere query's in één eenheid en geeft deze in één netwerkreis door aan een database.

In dit artikel zullen we ontdekken hoe JDBC kan worden gebruikt voor batchverwerking van SQL-query's.

Voor meer informatie over JDBC kunt u hier ons introductieartikel lezen.

2. Waarom batchverwerking?

Prestaties en gegevensconsistentie zijn de belangrijkste drijfveren voor batchverwerking.

2.1. Verbeterde prestatie

Sommige use-cases vereisen dat een grote hoeveelheid gegevens in een databasetabel wordt ingevoegd. Tijdens het gebruik van JDBC is een van de manieren om dit te bereiken zonder batchverwerking, door meerdere queries achter elkaar uit te voeren.

Laten we eens kijken naar een voorbeeld van opeenvolgende zoekopdrachten die naar de database worden gestuurd:

statement.execute ("INSERT IN WERKNEMER (ID, NAAM, AANWIJZING)" + "VALUES ('1', 'EmployeeName1', 'Designation1')"); statement.execute ("INVOEGEN IN WERKNEMER (ID, NAAM, AANWIJZING)" + "WAARDEN ('2', 'WerknemerNaam2', 'Aanwijzing2')");

Door deze opeenvolgende oproepen zal het aantal netwerkreizen naar de database toenemen, wat resulteert in slechte prestaties.

Door batchverwerking te gebruiken, kunnen deze vragen in één keer naar de database worden gestuurd, waardoor de prestaties worden verbeterd.

2.2. Data consistentie

In bepaalde omstandigheden moeten gegevens in meerdere tabellen worden gepusht. Dit leidt tot een onderling gerelateerde transactie waarbij de volgorde van de zoekopdrachten die worden gepusht belangrijk is.

Eventuele fouten die tijdens de uitvoering optreden, moeten resulteren in een terugdraaien van de gegevens die door eerdere query's zijn gepusht, indien van toepassing.

Laten we een voorbeeld bekijken van het toevoegen van gegevens aan meerdere tabellen:

statement.execute ("INSERT IN WERKNEMER (ID, NAAM, AANWIJZING)" + "VALUES ('1', 'EmployeeName1', 'Designation1')"); statement.execute ("INSERT IN EMP_ADDRESS (ID, EMP_ID, ADDRESS)" + "VALUES ('10', '1', 'Address')"); 

Een typisch probleem bij de bovenstaande benadering doet zich voor wanneer de eerste instructie slaagt en de tweede instructie mislukt. In deze situatie is er geen terugdraaiing van de gegevens die zijn ingevoegd door de eerste instructie, wat leidt tot inconsistentie in de gegevens.

We kunnen gegevensconsistentie bereiken door een transactie over meerdere invoegingen / updates te omspannen en vervolgens de transactie aan het einde door te voeren of een rollback uit te voeren in geval van uitzonderingen, maar in dit geval raken we de database nog steeds herhaaldelijk voor elke instructie.

3. Hoe u batchverwerking uitvoert

JDBC biedt twee klassen, Uitspraak en PreparedStatement om query's op de database uit te voeren. Beide klassen hebben hun eigen implementatie van het addBatch () en executeBatch () methoden die ons voorzien van de batchverwerkingsfunctionaliteit.

3.1. Batchverwerking met behulp van Uitspraak

Met JDBC is de eenvoudigste manier om query's op een database uit te voeren via de Uitspraak voorwerp.

Ten eerste, met behulp van addBatch () we kunnen alle SQL-query's aan een batch toevoegen en vervolgens die SQL-query's uitvoeren met executeBatch ().

Het retourtype van executeBatch () is een int array die aangeeft hoeveel records werden beïnvloed door de uitvoering van elke SQL-instructie.

Laten we eens kijken naar een voorbeeld van het maken en uitvoeren van een batch met Statement:

Verklaring statement = connection.createStatement (); statement.addBatch ("INVOEGEN IN WERKNEMER (ID, NAAM, AANWIJZING)" + "WAARDEN ('1', 'Werknemersnaam', 'Aanwijzing')"); statement.addBatch ("INSERT IN EMP_ADDRESS (ID, EMP_ID, ADDRESS)" + "VALUES ('10', '1', 'Address')"); statement.executeBatch (); 

In het bovenstaande voorbeeld proberen we records in te voegen in het WERKNEMER en EMP_ADDRESS tabellen met Uitspraak. We kunnen zien hoe SQL-queries worden toegevoegd aan de uit te voeren batch.

3.2. Batchverwerking met behulp van PreparedStatement

PreparedStatement is een andere klasse die wordt gebruikt om SQL-query's uit te voeren. Het maakt hergebruik van SQL-instructies mogelijk en vereist dat we nieuwe parameters instellen voor elke update / insert.

Laten we een voorbeeld bekijken met PreparedStatement. Eerst stellen we de instructie op met behulp van een SQL-query die is gecodeerd als een Draad:

String [] WERKNEMERS = nieuwe String [] {"Zuck", "Mike", "Larry", "Musk", "Steve"}; String [] DESIGNATIONS = nieuwe String [] {"CFO", "CSO", "CTO", "CEO", "CMO"}; String insertEmployeeSQL = "INVOEGEN IN WERKNEMER (ID, NAAM, BENAMING)" + "WAARDEN (?,?,?)"; PreparedStatement employeeStmt = connection.prepareStatement (insertEmployeeSQL);

Vervolgens doorlopen we een reeks Draad waarden en voeg een nieuw geconfigureerde query toe aan de batch.

Zodra de lus is voltooid, voeren we de batch uit:

for (int i = 0; i <EMPLOYEES.length; i ++) {String employeeId = UUID.randomUUID (). toString (); employeeStmt.setString (1, employeeId); employeeStmt.setString (2, MEDEWERKERS [i]); employeeStmt.setString (3, BENAMINGEN [i]); werknemerStmt.addBatch (); } employeeStmt.executeBatch (); 

In het bovenstaande voorbeeld voegen we records in de WERKNEMER tafel gebruiken PreparedStatement. We kunnen zien hoe de in te voegen waarden in de query worden ingesteld en vervolgens aan de uit te voeren batch worden toegevoegd.

4. Conclusie

In dit artikel hebben we gezien hoe batchverwerking van SQL-query's belangrijk is bij interactie met databases die JDBC gebruiken.

Zoals altijd is de code met betrekking tot dit artikel te vinden op Github.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS