2010-09-19 11 views
8

Ich habe Daten, die von der 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. Für Java-Programme habe ich jedoch keine Möglichkeit gefunden, dies einfach oder fast schnell genug zu tun.Was ist die effizienteste Methode zum Massenkopieren von Java nach SQL Server?

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

  • die 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 JDBCs Batch-Einfügung gesehen. Dies ist auch nur lokal nützlich.

  • Dateien auf die Festplatte schreiben und das Befehlszeilenprogramm bcp verwenden. 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 da draußen eine freie Java-Bibliothek gibt, würde ich das gerne wissen.

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

Danke!

+0

Wenn Sie sagen, dass die Quelle der Daten Java ist - können Sie das ausarbeiten? Sind die Daten im Speicher einer Java-Anwendung/eines Applets? – InSane

+0

Vielen Dank für Ihre Antwort in Sane. Ich habe die Frage etwas ausführlicher formuliert. –

Antwort

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 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 Anrufe würde ich empfehlen, JNA (Java Native Access) zu verwenden. Dann müssen Sie keinen C-Code schreiben.
+0

Diese Antwort hat einige nützliche Informationen, wenn ich jemals mit einer dieser Lösungen gehe. Es wäre toll, wenn jemand bereits eine nette, kostenlose Bibliothek geschrieben hätte, die die C-API in eine schönere Oberfläche verpacken würde. Ich könnte das am Ende selbst tun. –

0

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

Verwandte Themen