8 Stimmen

Was ist der effizienteste Weg, eine Massenkopie von Java nach SQL Server durchzuführen?

Ich habe Daten, die von der Festplatte gestreamt und im Speicher von einer Java-Anwendung verarbeitet werden und die schließlich in SQL Server kopiert werden müssen. Die Daten können ziemlich groß sein (daher das Streaming) und es können bis zu mehreren 100.000 Zeilen eingefügt werden. Die schnellste Lösung scheint die Verwendung der Bulk-Copy-Funktion von SQL Server zu sein. Ich habe jedoch keine Möglichkeit gefunden, wie Java-Programme dies einfach und schnell genug durchführen können.

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

  • Verwendung der Klasse SqlBulkCopy in .NET. Dies ist sehr effizient, da Sie Daten direkt aus einer Datenquelle in den SQL Server übertragen können. Das Problem bei diesem Ansatz ist, dass Sie .NET verwenden müssen. Vielleicht könnte man dies mit einer Java-zu-.NET-Brücke nutzen. Ich frage mich allerdings, wie hoch die Kosten für das Marshalling von Daten zwischen den Laufzeiten sind.

  • Verwendung der TSQL-Anweisung BULK INSERT. Das Problem dabei ist, dass Sie eine ordnungsgemäß formatierte Datei auf der Festplatte erstellen müssen. Ich habe einige kleine Leistungssteigerungen gegenüber der JDBC-Batch-Insert-Anweisung festgestellt. Außerdem ist dies nur lokal nützlich.

  • Schreiben Sie Dateien auf die Festplatte und verwenden Sie das Befehlszeilenprogramm bcp. Das ist immer noch etwas schneller als das JDBC-Batch-Insert, aber nicht mehr so viel. Außerdem kann ich bei dieser Methode keine Transaktion verwenden.

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

Ich bin auf der Suche nach der schnellsten Lösung. Speicher ist kein Thema.

Gracias.

0 Stimmen

Wenn Sie sagen, dass die Quelle der Daten Java ist - können Sie das näher erläutern? Befinden sich die Daten im Speicher einer Java-Anwendung/eines Applets?

0 Stimmen

Danke für Ihre Antwort, In Sane. Ich habe die Frage ein wenig ausführlicher formuliert.

1voto

Horcrux7 Punkte 22751
  • Für die .NET Antwort würde ich IKVM empfehlen. Dann wird Ihr Java Code zu .NET Code und Sie können jeden .NET Code aufrufen.
  • Die BULK INSERT erfordert auch, dass die Bulk-Datei von SQL Server aus zugänglich ist. Dies ist nur eine lokale Option. Die Leistung von Batch Update kann zwischen verschiedenen JDBC-Treibern variieren.
  • Für native Aufrufe würde ich die Verwendung von JNA (Java Native Access) empfehlen. Dann brauchen Sie keinen C-Code zu schreiben.

0 Stimmen

Diese Antwort enthält einige nützliche Informationen, falls ich mich jemals für eine dieser Lösungen entscheiden sollte. Es wäre toll, wenn jemand bereits eine nette freie Bibliothek geschrieben hätte, die die C-API in eine schönere Schnittstelle verpackt. Vielleicht mache ich das am Ende selbst.

0voto

SAsInSumit Punkte 21

Die beste Option für mich war die Verwendung des kommerziellen SQL Server JDBC-Treibers von DataDirect mit standardmäßigen JDBC-Aufrufen addBatch/executeBatch, die unter Linux und Windows ausgeführt werden. https://blogs.datadirect.com/2012/05/how-to-bulk-insert-jdbc-batches-into-microsoft-sql-server-oracle-sybase.html

Ich habe festgestellt, dass sich die Ladezeiten von 7 Stunden auf unter 30 Minuten verbessert haben.

0voto

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 SqlBulkCopy Klasse von .NET.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X