# Tabelle (elegant) importieren



## Ypsilon (3. Feb 2011)

Hallo zusammen.

Ich muss mithilfe einer JDBC-Verbindung größere Datenmengen (ca. 30000-80000 Datensätze) in eine Datenbank importieren. Die Daten stammen aus einer CSV-Datei.
Ich arbeite bisher mit einem PreparedStatement über das innerhalb einer Schleife jeweils eine Insert-Anweisung pro Datensatz ausgeführt wird.
Also etwa so:

```
PreparedStatement stmt = con,prepareStatement("Insert into.....");
while((nextLine =reader.readNext()) != null) {
     //[...]
     stmt.setInt(ID, nextLine[0]);
     //[...]
     stmt.executeUpdate();
}
```
Gibt es hierzu eine effizientere oder elegantere Alternative?

Im voraus schon mal  Danke!


----------



## beginner99 (4. Feb 2011)

Was heisst effizienter? Oder so wie es jetzt ist, ist es zu langsam?

Eine Möglichkeit wäre auto-commit auf false setzten und dann batch-weise einfügen.



```
connection.setAutoCommit(false);

while((nextLine =reader.readNext()) != null) {
     //[...]
     stmt.setInt(ID, nextLine[0]);
     //[...]
    statement.addBatch();
}

statement.executeBatch();
connection.commit();
```

Sollte theoretisch schneller sein, allerdings bei 80'000 records dürfte nicht alles in einem Batch gehen, also irgendwie immer 1000 zusammen oder so einfügen:

JDBC Batch Insert OutOfMemoryError - Stack Overflow


----------



## DerEisteeTrinker (4. Feb 2011)

Ich weiß ja nicht, welche Datenbank du verwendest, aber schau mal nach, ob es vllt eine Möglichkeit gibt, dass du deiner Datenbank gleich eine ganze Datei überhilfst und die das für dich macht. Da haben sich sicher mächtig kluge Köpfe schon mal mit beschäftigt :rtfm:


----------



## beginner99 (4. Feb 2011)

Genau oracle oder MS (sql server) haben sicher solche tools, für java Datenbanken sieht es aber eher schlecht aus.

Ist auch die Frage ob das maintenance ist oder im Normalbetrieb abläuft und wie vertrauenswürdig die Daten sind. Ich denke man versteht auf was ich hinaus will.

EDIT:
@OP
Mit hsqldb hättest du noch die option mit Text tables aber ka was für ein RDBMS du hast.


----------



## henpara (7. Feb 2011)

Der schnellste Weg, den ich kenn ist, die SQL-Statements in ein File zu schreiben und via Batch datei direkt in die Datenbank einzulesen, bei DB2 sieht die batch datei zB so aus:


> db2 connect to datenbank user deinUsername
> 
> db2 -t -f X:\programme\dein Pfad\outdatei.sql -v -z X:\programme\dein Pfad\out.log
> db2 disconnect datenbank



die batch-datei kannst du ja dann leicht von deinem java-programm anlegen lassen und ausführen.


----------

