CSV Datein in DB übernehmen:PreparedStatement bzw executeBatch() zu langsam

student86

Mitglied
Moin Moin,
Möchte eigentlich ganz easy den inhalt der csv datei in die DB schreiben. Sind ein paar tausend Lines.
Ich hab gelesen das 100 lines mit der methode 0,7 sek. dauern. Bei mir dauert der vorgang aber über 20 minuten ....

Java Code:

Code:
        String line;	
        String[]values;
        PreparedStatement st = connection.prepareStatement("INSERT INTO Symboltabelle VALUES (?, ?);");
        while ((line=bufferreader.readLine())!=null){
        values=line.split(";");
        st.setString(1, values[0]);
        st.setString(2, values[1])
        st.addBatch();
        }
        st.executeBatch();

jemand eine Idee wieso es so langsam ist ?

Genauer : das ps.executeBatch() brauch die 20 min ^^
MFG
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Moin,

mal so auf die Schnelle und ins Blaue geraten:

addBatch(): Adds a set of parameters to this PreparedStatement object's batch of commands.

Das bedeutet, das Du zuerst alle (also alle 'paar Tausend') Zeilen liest, splittest und das jeweilige CMD ins Batch des Objekts st schreibst ... das KANN so nicht performat sein !!

Gruß Klaus
 

stg

Top Contributor
Ach das bisschen Spielerei mit den String sollte nicht sooo wild sein (das dauert jedenfalls sicherlich keine 20min! :) )

Ich tippe vielmehr darauf, dass hier falsch mit Transaktionen umgegangen wird und jede Statement einzeln comitted wird ... ist zwar anhand des Codes hier nicht wirklich ersichtlich, aber anders kann ich mir die lange Laufzeit nicht erklären.
 

Tom299

Bekanntes Mitglied
ich hab die gleiche vermutung wie stg:
probier mal autocommit auf false setzen, dann die inserts machen und danach 1x commit.

ps: addBatch hab ich noch nie verwendet
 

student86

Mitglied
Vielen dank für die antworten:
Java:
        String line;	
        String[]values;
        connection.setAutoCommit(false);
        PreparedStatement st = connection.prepareStatement("INSERT INTO Symboltabelle VALUES (?, ?);");
        while ((line=bufferreader.readLine())!=null){
        values=line.split(";");
        st.setString(1, values[0]);
        st.setString(2, values[1])
        st.addBatch();
        }
connection.commit();
        st.executeBatch();

also er läuft nun direkt durch , aber die DB bleibt leer.
das mit dem einmaligen commit versteh ich nicht, das kommmt mir so falsch vor.
 

Tom299

Bekanntes Mitglied
Laß mal die 2 Batch-Aufrufe weg und benutz st.executeUpdate() und danach kommt der commit.

Ist ein Batch nicht dafür da, etwas zu einem späteren Zeitpunkt auszuführen?
 
Zuletzt bearbeitet:

stg

Top Contributor
Vielen dank für die antworten:
Java:
        String line;	
        String[]values;
        connection.setAutoCommit(false);
        PreparedStatement st = connection.prepareStatement("INSERT INTO Symboltabelle VALUES (?, ?);");
        while ((line=bufferreader.readLine())!=null){
        values=line.split(";");
        st.setString(1, values[0]);
        st.setString(2, values[1])
        st.addBatch();
        }
connection.commit();
        st.executeBatch();

also er läuft nun direkt durch , aber die DB bleibt leer.
das mit dem einmaligen commit versteh ich nicht, das kommmt mir so falsch vor.

Der commit ist zu früh. Du musst natürlich comitten, nachdem du die statements mit st.executeBatch(); ausgeführt hast. Vertausch also einfach mal diese beiden Zeilen!
 

student86

Mitglied
Ja so geht das :)

aber verstanden hab ich das nicht.
durch das execute Batch schreibe ich doch die daten aus dem Statment in die Datenbank.
passt das commit() die Daten nachträglich an?
bzw was genau macht ein commit()?
das klärt nicht meine Fragezeichen:)
Makes all changes made since the previous commit/rollback permanent and releases any database locks currently held by this Connection object. This method should be used only when auto-commit mode has been disabled.
 

Tom299

Bekanntes Mitglied
Wie das intern genau funktioniert, weiß ich nicht, aber ich vermute mal, die Daten werden zuerst in den Puffer/Zwischenspeicher der Datenbank geschrieben und erst beim Commit auf die Festplatte. Mit einem Rollback anstatt einem Commit macht man die Änderungen wieder rückgängig.

Deswegen sieht man dann normalerweilse das Commit im try {} Block und das Rollback mit catch{} Block.
 
Zuletzt bearbeitet:

stg

Top Contributor
Du kannst dir das in etwa so verstellen:
Zunächst werden der Datenbank nur die auszuführenden Befehle mitgeteilt. Erst mit dem Commit werden die Befehle dann tatsächlich physisch ausgeführt und damit in deinem Fall die Daten in die Datenbank geschrieben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Update DB; Werte aus Feldern übernehmen Datenbankprogrammierung 5
P Wie Usernamen beim Einloggen für Combobox übernehmen?HELP Datenbankprogrammierung 2
Kirby.exe PreparedStatement wird nicht ausgeführt Datenbankprogrammierung 5
V SQLite NullPointerException in preparedStatement.close(); Datenbankprogrammierung 8
Neumi5694 SQL-Statement Preparedstatement - try resource vs. Garbage Collector Datenbankprogrammierung 5
S JDBC PreparedStatement durchiterieren Datenbankprogrammierung 6
P MySQL PreparedStatement vs. StoredProcedure vs. executeBatch Datenbankprogrammierung 1
P PreparedStatement IN-Funktion Datenbankprogrammierung 8
R PreparedStatement ohne Parameter? Datenbankprogrammierung 4
turmaline Oracle [PreparedStatement] Klammer fehlt Datenbankprogrammierung 9
C PreparedStatement und null Datenbankprogrammierung 13
J Problem bei Boolean in PreparedStatement Datenbankprogrammierung 5
M Variable in SQL SELECT * FROM ... WHERE mithilfe von PreparedStatement benutzen? Datenbankprogrammierung 28
D MySQL PreparedStatement mit c3p0 schlägt fehl. Warum? Datenbankprogrammierung 3
S Oracle Problem mit PreparedStatement.setString(1,"str") Datenbankprogrammierung 10
M MySQL preparedStatement und Anführungszeichen Datenbankprogrammierung 6
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
G PreparedStatement und Transaktionen Datenbankprogrammierung 2
N Leeres Blob in ein PreparedStatement eintragen Datenbankprogrammierung 2
P PreparedStatement batch und getGeneratedKeys Datenbankprogrammierung 7
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
B H2 PreparedStatement SELECT * FROM ? Datenbankprogrammierung 4
M FindBugs und PreparedStatement aus einer Datei lesen Datenbankprogrammierung 11
Guybrush Threepwood PreparedStatement: execute() oder executeUpdate() Datenbankprogrammierung 3
R PreparedStatement mit verschiedenen Datenbanken Datenbankprogrammierung 2
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
R Zugriff auf SQL im PreparedStatement Datenbankprogrammierung 4
W preparedStatement (MySQL - JDBC) Datenbankprogrammierung 5
Landei PreparedStatement Parameter mehrfach verwenden Datenbankprogrammierung 18
S Create Table mit PreparedStatement Datenbankprogrammierung 2
S Select mit PreparedStatement Datenbankprogrammierung 2
S PreparedStatement setArray(int i, java.sql.Array) Datenbankprogrammierung 17
M Preparedstatement SQL-string auslesen Datenbankprogrammierung 13
T PreparedStatement anzeigen Datenbankprogrammierung 10
A PreparedStatement im Servlet - Referenz speichern Datenbankprogrammierung 3
P PreparedStatement - Angabe des PK Datenbankprogrammierung 4
J Fehler beim PreparedStatement Datenbankprogrammierung 2
B PreparedStatement - anzahl ParameterValues Datenbankprogrammierung 6
J PreparedStatement Datenbankprogrammierung 5
C PreparedStatement Datenbankprogrammierung 2
R DB2 PreparedStatement Batches ungültige Reihenfolge Datenbankprogrammierung 4

Ähnliche Java Themen


Oben