Api voor bulksgewijs kopiëren gebruiken voor batchinvoegbewerking
JDBC-stuurprogramma downloaden
Microsoft JDBC-stuurprogramma voor SQL Server versie 9.2 en hoger biedt ondersteuning voor het gebruik van de Bulk Copy-API voor batchinvoegbewerkingen. Met deze functie kunnen gebruikers de driver toestaan om bulk-kopieerbewerkingen uit te voeren tijdens batchinvoegbewerkingen. Het stuurprogramma is erop gericht om de prestaties te verbeteren en tegelijkertijd dezelfde gegevens in te voegen als het stuurprogramma zou hebben met een normale batchinvoegbewerking. Het stuurprogramma parseert de SQL-query van de gebruiker met behulp van de API voor bulksgewijs kopiëren in plaats van de gebruikelijke batchinvoegbewerking. De volgende instellingen zijn uiteenlopende manieren om de Bulk Copy API in te schakelen voor de batch-invoegfunctie en schetsen de beperkingen ervan. Deze pagina bevat ook een kleine voorbeeldcode die ook een gebruik en een toename van de prestaties laat zien.
Deze functie is alleen van toepassing op De executeBatch()
& executeLargeBatch()
API's van PreparedStatement en CallableStatement.
Voorwaarden
Vereiste voor het inschakelen van de API voor bulk kopiëren voor batch-invoer.
- De query moet een invoegquery zijn (de query kan opmerkingen bevatten, maar de query moet beginnen met het sleutelwoord INSERT om deze functie in werking te laten treden).
Inschakelen van de Bulk-copy-API voor batchinsertie
Er zijn drie manieren om bulksgewijs kopiëren-API in te schakelen voor batchinvoeging.
1. Inschakelen met verbindingseigenschap
Als u useBulkCopyForBatchInsert=true;
toevoegt aan de verbindingsreeks, wordt deze functie ingeschakeld.
Connection connection = DriverManager.getConnection("jdbc:sqlserver://<server>:<port>;userName=<user>;password=<password>;database=<database>;encrypt=true;useBulkCopyForBatchInsert=true;");
2. Inschakelen met de methode setUseBulkCopyForBatchInsert() van het SQLServerConnection-object
Als u SQLServerConnection.setUseBulkCopyForBatchInsert(true) aanroept, wordt deze functie ingeschakeld.
SQLServerConnection.getUseBulkCopyForBatchInsert() de huidige waarde voor useBulkCopyForBatchInsert verbindingseigenschap ophaalt.
De waarde voor useBulkCopyForBatchInsert blijft constant voor elke PreparedStatement op het moment van de initialisatie. Volgende aanroepen naar SQLServerConnection.setUseBulkCopyForBatchInsert() hebben geen invloed op de waarde van de reeds gemaakte PreparedStatement.
3. Inschakelen met de methode setUseBulkCopyForBatchInsert() van het SQLServerDataSource-object
Net als bij de vorige optie, maar sqlServerDataSource gebruiken om een SQLServerConnection-object te maken. Beide methoden bereiken hetzelfde resultaat.
Bekende beperkingen
Er zijn momenteel deze beperkingen die van toepassing zijn op deze functie.
- Queries invoegen die niet-geparameteriseerde waarden bevatten (bijvoorbeeld
INSERT INTO TABLE VALUES (?, 2
), wordt niet ondersteund. Jokertekens (?) zijn de enige ondersteunde parameters voor deze functie. - Queries die INSERT-SELECT-expressies bevatten (bijvoorbeeld
INSERT INTO TABLE SELECT * FROM TABLE2
), worden niet ondersteund. - Het invoegen van query's die meerdere WAARDE-expressies bevatten (bijvoorbeeld
INSERT INTO TABLE VALUES (1, 2) (3, 4)
) wordt niet ondersteund. - Het invoegen van query's die gevolgd worden door de OPTION-clausule, gekoppeld zijn aan meerdere tabellen of gevolgd worden door een andere query, wordt niet ondersteund.
-
IDENTITY_INSERT
wordt niet beheerd in het stuurprogramma. Neem geen identiteitskolommen op in invoeginstructies, stel deIDENTITY_INSERT
status van uw tabellen tussen batchinvoeginstructies handmatig in of geef handmatig de expliciete waarde voor een identiteitskolom door met de invoeginvoeginstructie. Zie SET IDENTITY_INSERTvoor meer informatie. - Vanwege de beperkingen van bulksgewijs kopiëren-API worden
MONEY
,SMALLMONEY
,DATE
,DATETIME
,DATETIMEOFFSET
,SMALLDATETIME
,TIME
,GEOMETRY
enGEOGRAPHY
gegevenstypen momenteel niet ondersteund voor deze functie.
Als de query mislukt vanwege fouten die niet zijn gerelateerd aan het SQL Server-exemplaar, registreert het stuurprogramma het foutbericht en valt het terug op de oorspronkelijke logica voor batchinvoeging.
Voorbeeld
In dit voorbeeld ziet u de use-case voor een batchinvoegbewerking van duizend rijen, voor zowel reguliere als bulksgewijs kopiëren-API-scenario's.
public static void main(String[] args) throws Exception
{
String tableName = "batchTest";
String tableNameBulkCopyAPI = "batchTestBulk";
String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=<database>;user=<user>;password=<password>";
try (Connection con = DriverManager.getConnection(connectionUrl);
Statement stmt = con.createStatement();
PreparedStatement pstmt = con.prepareStatement("insert into " + tableName + " values (?, ?)");) {
String dropSql = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[" + tableName + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [" + tableName + "]";
stmt.execute(dropSql);
String createSql = "create table " + tableName + " (c1 int, c2 varchar(20))";
stmt.execute(createSql);
System.out.println("Starting batch operation using regular batch insert operation.");
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
pstmt.setInt(1, i);
pstmt.setString(2, "test" + i);
pstmt.addBatch();
}
pstmt.executeBatch();
long end = System.currentTimeMillis();
System.out.println("Finished. Time taken : " + (end - start) + " milliseconds.");
}
try (Connection con = DriverManager.getConnection(connectionUrl + ";useBulkCopyForBatchInsert=true");
Statement stmt = con.createStatement();
PreparedStatement pstmt = con.prepareStatement("insert into " + tableNameBulkCopyAPI + " values (?, ?)");) {
String dropSql = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[" + tableNameBulkCopyAPI + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [" + tableNameBulkCopyAPI + "]";
stmt.execute(dropSql);
String createSql = "create table " + tableNameBulkCopyAPI + " (c1 int, c2 varchar(20))";
stmt.execute(createSql);
System.out.println("Starting batch operation using Bulk Copy API.");
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
pstmt.setInt(1, i);
pstmt.setString(2, "test" + i);
pstmt.addBatch();
}
pstmt.executeBatch();
long end = System.currentTimeMillis();
System.out.println("Finished. Time taken : " + (end - start) + " milliseconds.");
}
}
Resultaat:
Starting batch operation using regular batch insert operation.
Finished. Time taken : 104132 milliseconds.
Starting batch operation using Bulk Copy API.
Finished. Time taken : 1058 milliseconds.
Zie ook
Prestaties en betrouwbaarheid verbeteren met het JDBC-stuurprogramma