Was ist die effizienteste Methode zum Massenkopieren von Java nach SQL Server?

8

Ich habe Daten, die von einer Festplatte gestreamt und von einer Java-Anwendung im Speicher verarbeitet werden und die schließlich in SQL Server kopiert werden müssen. Die Daten können ziemlich groß sein (daher das Streaming) und können das Einfügen von bis zu mehreren 100.000 Zeilen erfordern. Die schnellste Lösung scheint die Massenkopierfunktion von SQL Server zu verwenden. Allerdings habe ich für Java-Programme keine Möglichkeit gefunden, dies einfach oder fast schnell genug zu tun.

Hier sind einige Möglichkeiten, die ich bereits untersucht habe:

  • Verwenden der SqlBulkCopy-Klasse in .NET. Dies ist sehr effizient, da Sie Daten direkt von einer Datenquelle und direkt zu SQL Server streamen können. Das Problem bei diesem Ansatz ist, dass Sie .NET ausführen müssen. Vielleicht könnte dies mit einer Java zu .NET Brücke verwendet werden. Obwohl ich mich über die Kosten für das Marshalling von Daten zwischen Laufzeiten wundere.

  • Verwenden der BULK INSERT-TSQL-Anweisung. Das Problem dabei ist, dass Sie eine korrekt formatierte Datei auf der Festplatte erstellen müssen. Ich habe einige kleine Leistungszuwächse gegenüber dem JDBC-Batch-Einsatz gesehen, der dies verwendet. Dies ist auch nur lokal nützlich.

  • Schreiben Sie Dateien auf die Festplatte und verwenden Sie das Befehlszeilenprogramm bcp. Immer noch ein wenig schneller als JDBC Batch-Einsatz, aber nicht so viel. Ich verliere auch die Fähigkeit, eine Transaktion mit dieser Methode zu verwenden.

  • Verwenden Sie die C-API . Nochmals, sehr effizient, aber Sie müssen C verwenden. Es wäre eine Möglichkeit, dies über JNI zu nutzen. Wenn es eine freie Java-Bibliothek gibt, die das tut, würde ich es gerne wissen.

Ich suche nach der schnellsten Lösung. Speicher ist kein Problem.

Danke!

    
Tristan St-Cyr 19.09.2010, 16:15
quelle

3 Antworten

1
  • Für die .NET-Antwort würde ich IKVM empfehlen. Dann ist Ihr Java-Code .NET-Code und Sie können beliebigen .NET-Code aufrufen.
  • Der BULK INSERT erforderte außerdem, dass auf die Bulk-Datei von SQL Server aus zugegriffen werden kann. Dies ist nur eine lokale Option. Die Leistung von Batch Update kann zwischen verschiedenen JDBC-Treibern variieren.
  • Für native Anrufe würde ich JNA (Java native access) empfehlen. Dann müssen Sie keinen C-Code schreiben.
Horcrux7 19.09.2010 16:59
quelle
0

Die beste Option für mich war die Verwendung des kommerziellen SQL Server JDBC-Treibers von DataDirect mit den standardmäßigen JDBC-Aufrufen addBatch / executeBatch, die über Linux und Windows laufen - Ссылка

Ich habe Ladezeiten von 7 Stunden auf unter 30 Minuten verbessert.

    
SAsInSumit 22.07.2015 19:35
quelle
0

Seit Version 4.2 des Microsoft JDBC-Treibers für SQL Server gibt es eine Klasse namens com.microsoft.sqlserver.jdbc.SQLServerBulkCopy , die dasselbe tut wie die Klasse SqlBulkCopy von .NET.

    
Christian d'Heureuse 18.05.2016 20:39
quelle

Tags und Links