# CSV Datei in MSSQL DB oder doch SQL Script



## HakBak (14. Jan 2010)

Hallo,
ich stehe vor einem Problem und zwar erstelle ich in meinem Javaprogramm im Augenblick eine txt.Datei mit Daten, die per ; voneinander getrennt sind.
Diese Datei wird direkt auf einem Rechner erstellt, auf dem ein MS-SQL Server läuft. Nun möchte ich diese Daten in die Datenbank bringen.
Meine erste Idee war, das ganze per bulk insert in eine temp-Tabelle zu schreiben und dann die eigentlich aktuelle Tabelle mit der temp-Tabelle zu updaten. Nun ist es aber so, dass die temp-Tabelle weniger Spalten haben wird, als die eigentlich Tabelle. Jetzt weiss ich nciht, ob das so einfach möglich ist.

Meine nächste Idee war es, keine Daten-datei zu erstellen, sondern ein sql-script, welches updates und inserts der daten beinhaltet. Jetzt weiss ich allerdings nicht, ob, und wenn ja, wie ich per Java eine sql-script ausführe. Und es soll nciht mit einem FileReader eingelesen werden und Zeile für Zeile durchgegangen werden, es soll direkt über einen Befehl oder sonst was vom SQL-Server ausgeführt werden, eben ähnlich einem Bulk-insert.

Meine dritte Idee war es, die Daten-datei (wieder mit dem ; als Seperator), in eine extra dafür angelegte Tabelle zu schreiben, wieder mittels bulk-insert und diese dann mit stored procedures in die eigentlich produktiv Tabell zu updaten. Ich habe bis jetzt leider keinerlei Ahnung von stored procedure. Vielleicht könnt ihr mir ein wenig dabei helfen.

So, das sind meine drei Vorschläge, könnt ihr mir da irgendwie bei meiner Wahl helfen?
Danke


----------



## Atze (14. Jan 2010)

mysql kann auch selbst csv files lesen. das könntest du doch auch in java per jdbc anstoßen

MySQL :: MySQL 5.1 Referenzhandbuch :: 13.2.5 LOAD DATA INFILE


----------



## HakBak (14. Jan 2010)

Leider benutze ich keine MySQL, sondern einen MS-SQL Server


----------



## Atze (14. Jan 2010)

huch, ich hab mysql gelesen, sorry


----------



## Firestorm87 (15. Jan 2010)

Darf man fragen, warum du die Daten nicht direkt in die DB statt in die TXT schreibst?


----------



## HakBak (15. Jan 2010)

Weil das zu lange dauert, ich hab ca. 400.000 Datensätze und diese in die DB zu schreiben würde SEHR lange dauern - habs schon ausprobiert. Deswegen auch die Idee ein File direkt auf den Server zu schreiben und den Import von dort aus durchzuführen, da es übers Netz zu lange dauert.


----------



## maki (15. Jan 2010)

HakBak hat gesagt.:


> Weil das zu lange dauert, ich hab ca. 400.000 Datensätze und diese in die DB zu schreiben würde SEHR lange dauern - habs schon ausprobiert. Deswegen auch die Idee ein File direkt auf den Server zu schreiben und den Import von dort aus durchzuführen, da es übers Netz zu lange dauert.


Hast du mit batchUpdates & Transaktionen gearbeitet?
Die größe der beiden macht den Unterschied 

Wenn du weder das eine noch das andere eingesetzt hast, wirdf es Zeit, denn der Umweg über die Datei ist nicht wirklich der direkte Weg


----------



## Firestorm87 (15. Jan 2010)

Also eigentlich solltest du aus performance Gründen eher den Weg über die DB wählen, als über ein extra File...
Denn ob du das ganze in eine Datei schreibst, oder in die DB (so lange Sie das noch nicht direkt persistiert), spielt keine Rolle....
Und das ganze fix persistieren sollte dann schneller gehen, als ein weiterer Import aus dem File.


----------



## HakBak (15. Jan 2010)

Also direkt vom Programm aus, über eine Connection immer ein ein Updatestatement absetzen, dauert einfach zu lange.
Über eine Transaktion, die bei mir wie folgt aussehen würde:


```
Connection connMSSQLTest   = connectToMSSQLStamm();
            connMSSQLTest.setAutoCommit(false);
            Statement stmt;
            try
            {
                stmt = connMSSQLTest.createStatement();
                for(String elem : entityMap.keySet())
                {
                    count++;
                    KEntity entity = entityMap.get(elem); //die entityMap beinhaltet ca. 400000 Objekte, in denen die Daten, die in die Datenbank sollten, gespeichert sind
                    stmt.executeUpdate(entity.getUpdateStatement()); //gibt das Updatestatement mit den Daten zurück
                }
                connMSSQLTest.commit();
            }
```

Über Batch bekomm ich Probleme mit dem Speicher und es gibt nen heap space error. Vielleicht wenn, dich die Batch Updates aufsplitte ...?


----------



## maki (15. Jan 2010)

Wenn du 400000 Datensätze einfügen willst kommst du eigentlich nie mit der Standard Heapgröße aus, die JVM Paramter heissen Xms und Xmx.


----------



## Janus (15. Jan 2010)

Du solltest das Statement nur einmal kompilieren und für die jeweiligen Datensätze vor dem Update nur die Bindings entsprechend setzen. Bei zig tausend calls machen sich die paar Millisekunden schnell bemerkbar.


----------



## HakBak (15. Jan 2010)

Janus hat gesagt.:


> Du solltest das Statement nur einmal kompilieren und für die jeweiligen Datensätze vor dem Update nur die Bindings entsprechend setzen. Bei zig tausend calls machen sich die paar Millisekunden schnell bemerkbar.



Sorry, wenn ich nochmal nachfragen, muss, wie meinst du das? Bezieht sich das jetzt auf die Transaktion, oder auf die Batch-Update? Ich dachte, ich erstelle in meinem Code zuerst das komplette Statement...


----------

