Problem: Große Datei in MySQL DB importieren.

Status
Nicht offen für weitere Antworten.

meiaestro

Mitglied
Hallo,

bei der Ausführung nachfolgendem (hier gekürzt) Code erhalte ich folgende Fehlermeldung: Exception in thread "Thread-2" java.lang.OutOfMemoryError: Java heap space

Es ist eine Swing Anwendung, in der ich über eine MenüBar folgende Aktion auslöse (geThreaded).

Code:
public void  actionPerformed(ActionEvent e){
    new Thread() {
        public void run() {
            ---> Starten einer Prozedur um eine Datei einzulesen und Zeilenweise in die DB einzufügen
        }
    }.start();
}


In dieser "Prozedur" passiert grob folgendes:

Code:
//laden des Treibers
Class.forName("org.gjt.mm.mysql.Driver");
//Aufbau der Verbindung
con = DriverManager.getConnection("jdbc:mysql://192.168.1.1/SNOMED_CT", "***","***");

//Eine recht große Datei (26MB) wird Zeichenweise eingelesen und für jede Zeile ein entsprechendes SQL-Statement erzeugt
while ((chr = input.read()) != -1) {

//Datei Parsen und die korrekten Felder und Feldinhalte bestimmen

    try {
        con.createStatement().execute("INSERT INTO " + tableName + " SET " + fieldsValues + ";");
    } 
        catch (SQLException e) 
    {
        e.printStackTrace();
    }

}

//ganz zum Schluss soll die Verbindung zu DB getrennt werden (soweit kommt es nie)
con.close()

Nachdem genau 48% der Datei eingelesen wurden erhalte ich die oben genannte Fehlermeldung. Kurz vorher (bei ca. 40% der Datei) ist das Phänomen zu erkennen, dass die Prozessorlast von entspannten 50% auf gestresste 100% ansteigt. Der Speicherverlauf ist undspektakulär.

Entferne ich diese Zeile hier:
Code:
con.createStatement().execute("INSERT INTO " + tableName + " SET " + fieldsValues + ";");
...läuft alles wunderbar durch.

Freue mich über Tipps.
 

foobar

Top Contributor
Hast du irgendwo eine Rekursion? Oder behälst du Objekte im Speicher? Poste doch mal den ganzen Code.
 

meiaestro

Mitglied
sehe grad ich habe Müll geschrieben ;)

Natürlich musste ich diese Zeile entfernen, damit alles läuft:

Code:
con.createStatement().execute("INSERT INTO " + tableName + " SET " + fieldsValues + ";");

entschuldigt die Verwirrung.
 

SamHotte

Top Contributor
Du erzeugst für jedes Zeichen ein Statement ... das würde ich mal aus der while-Schleife 'rausnehmen, könnte eine Menge Platz und Zeit sparen.
 
G

Guest

Gast
Bin grad auf der Arbeit und kann daher leider nicht den Source-Code pasten. Natürlich erzeuge ich nicht zu jedem Zeichen ein Statement ;-) Bin ja nicht verrückt :autsch:

Die Textfiles sehen so aus, dass in der ersten Zeile die Feldnamen stehen (wie bei einer Tabelle). Die Werte sind-TAB-separiert. In den nächsten Zeilen stehen dann die Werte (ebenfalls TAB-separiert). Ich habe einen Parser gebaut, der erst die erste Zeile liest, um die Feldnamen zu bestimmen, und dann Zeilenweise die Werte bestimmt. In der Variable "fieldsValues" stehe dann die Feld-Wert Kombinationen drin:

feld1=wert1, feld2=wert2, feld3=wert3, usw.

Diese werden dann wie beschrieben an die DB geschickt.
 

SamHotte

Top Contributor
meiaestro hat gesagt.:
Code:
//laden des Treibers
Class.forName("org.gjt.mm.mysql.Driver");
//Aufbau der Verbindung
con = DriverManager.getConnection("jdbc:mysql://192.168.1.1/SNOMED_CT", "***","***");

//Eine recht große Datei (26MB) wird Zeichenweise eingelesen und für jede Zeile ein entsprechendes SQL-Statement erzeugt
while ((chr = input.read()) != -1) {

//Datei Parsen und die korrekten Felder und Feldinhalte bestimmen

    try {
        con.createStatement().execute("INSERT INTO " + tableName + " SET " + fieldsValues + ";");
    } 
        catch (SQLException e) 
    {
        e.printStackTrace();
    }

}

//ganz zum Schluss soll die Verbindung zu DB getrennt werden (soweit kommt es nie)
con.close()

Also für mich sieht das sehr wohl so aus, als ob du in der while-Schleife für jedes Zeichen ein Statement erzeugst ???:L
 

meiaestro

Mitglied
Mein Rechner ist grad abgeschmiert, daher kann ich den Source Code noch nicht posten. Aber glaube mir, es gibt ne Abfrage, die da heißt
Code:
 if ((char)chr == '\r'){
--> führe Query aus
}

also immer nach einer Zeile wird die Query ausgeführt. Die Daten kommen ja auch korrekt in der DB an.
 

SamHotte

Top Contributor
Ich glaube dir gern, es schien nur eine mögliche Ursache für den Speicherbedarf zu sein (worauf die ursprüngliche Frage abzielte) ;)
 
D

Dragoslav

Gast
Hallo,

müsste das Statement nicht wieder geschlossen werden?

in der Art:
java.sql.Statement stmt = con.createStatement();
stmt.execute("INSERT INTO " + tableName + " SET " + fieldsValues + ";");
stmt.close();

Servus,

~Stefan
 
D

Dragoslav

Gast
Hm, hab grad ein bisschen gegoogelt und bin über folgendes gefallen: dev.mysql.com/tech-resources/articles/connection_pooling_with_connectorj.html

Die machen bei setzten das Objekt sogar noch mit Null zurück, also:

Code:
/* Statment-Objekt außerhalb der Schleife */
java.sql.Statement stmt = null;
/* hier dann in der schleife */
    stmt = con.createStatement();
    stmt.execute("INSERT INTO " + tableName + " SET " + fieldsValues + ";");
    stmt.close(); 
    stmt = null;

Ist das vielleicht eine Hilfe für den Garbage-Collector?
 

meiaestro

Mitglied
Problem gelöst:

ein stmt.close(); hat geholfen. Der Batch funktionierte auch nicht, da dieser zu groß für den Java Cache wurde :-(

Danke für die Hilfen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J PC-Start Problem JDBC Connection Datenbankprogrammierung 10
C Problem mit Apache Poi Datenbankprogrammierung 6
N HSQLDB Problem mit Eclipselink in runnable Jar Datenbankprogrammierung 10
P GroupLayout-Problem Datenbankprogrammierung 12
F XAMPP max connections problem Datenbankprogrammierung 6
C MySQL Problem in phpMyAdmin Oberfläche Datenbankprogrammierung 5
C Problem with INSERT.............ON DUPLICATE KEY Datenbankprogrammierung 3
C Problem with insertion in database. Datenbankprogrammierung 7
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
W Problem mit Insert in zwei Tabellen Datenbankprogrammierung 8
G MySQL Problem mit MySQL verbindung Datenbankprogrammierung 8
A kleines Problem Datenbankprogrammierung 6
T Problem mit Datenbankverbindung Datenbankprogrammierung 22
V Derby/JavaDB updateRow Problem Datenbankprogrammierung 0
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
Nuiton EmbeddedDriver Problem Datenbankprogrammierung 6
A MongoDB Passwort Problem Datenbankprogrammierung 0
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
F MySQL JDBC Problem Datenbankprogrammierung 5
Anfänger2011 Datenbankstruktur/aufbau (theoretisches Problem) Datenbankprogrammierung 5
M Derby/JavaDB Drop Database problem Datenbankprogrammierung 3
M Derby/JavaDB NOT LIKE problem Datenbankprogrammierung 19
N HSQLDB Problem mit EntityManager Datenbankprogrammierung 7
B MySQL JPAContainer Problem Datenbankprogrammierung 4
K Eclipse Apache Derby Treiber Problem Datenbankprogrammierung 4
C Problem oder Denkfehler mit H2-Database Datenbankprogrammierung 3
E Wie kann man das Problem mit der BLOB-Spalte lösen? Datenbankprogrammierung 1
M Problem mit jcouchdb und CouchDB - UTF8 kein gültiger Zeichentyp Datenbankprogrammierung 4
T MySQL Problem mit Datenbankanbindung Datenbankprogrammierung 4
M INSERT-Problem = integrity constraint violation: foreign key no parent Datenbankprogrammierung 5
P SQL Query Problem Datenbankprogrammierung 14
A MySQL Problem bei Tabelle ausgeben Datenbankprogrammierung 3
Q MySQL JDBC-Treiber Problem Datenbankprogrammierung 2
B SQLite Problem bei Planung der Datenbank [Jeopardy] Datenbankprogrammierung 3
A Problem mit dem Import und Export von Bildern Datenbankprogrammierung 4
P Oracle Problem mit Umlauten Datenbankprogrammierung 9
A Problem mit Create-Statement Datenbankprogrammierung 9
D Problem mit COLUMN_IDENTIFIERS Datenbankprogrammierung 8
Bluedaishi MySQL Abfrage Problem :-) Datenbankprogrammierung 21
M Problem mit mehreren Datasourcen Datenbankprogrammierung 3
R Resultset.last() Problem Datenbankprogrammierung 12
M Problem GroupBy Datenbankprogrammierung 3
S CURRENT_DATE problem Datenbankprogrammierung 2
M Problem mt JPA Id-Generators Datenbankprogrammierung 18
Gossi Oracle Problem mit group by... Datenbankprogrammierung 22
M MySQL SQL Abfrage Problem Datenbankprogrammierung 6
R MS-SQL Express Login-Problem Datenbankprogrammierung 8
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
N HSQLDB Problem beim Treiberladen im Jar Datenbankprogrammierung 6
M Problem beim Erstellen einer Query Datenbankprogrammierung 7
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
M Problem mit HQL Syntax Datenbankprogrammierung 5
K Db4o Delete Problem Datenbankprogrammierung 11
Mike90 Deadlock/Lock Problem Datenbankprogrammierung 4
T Access 32bit on Win7 64Bit ODBC Problem Datenbankprogrammierung 1
C unverständliches DB Problem (Es ist kein temporärer Systemtabellenbereich mit einer ausreichenden..) Datenbankprogrammierung 5
S ODBC Treiber Problem/oder unvermögen Datenbankprogrammierung 18
J Problem bei Boolean in PreparedStatement Datenbankprogrammierung 5
C MySQL Problem mit UPDATE Abfrage Datenbankprogrammierung 13
C Problem mit SQL-Abfrage Datenbankprogrammierung 5
K Problem mit Datenbankverbindung via Eclipse Datenbankprogrammierung 2
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
S Oracle Problem mit PreparedStatement.setString(1,"str") Datenbankprogrammierung 10
B MySQL Problem mit Datenbankanbindung an MySQL Datenbankprogrammierung 2
N Problem bei Erstellung eines Index Datenbankprogrammierung 12
C Hibernate Property-Problem Datenbankprogrammierung 5
J MyBatis - Update Problem Datenbankprogrammierung 4
S JPA: Problem mit Update von Daten Datenbankprogrammierung 7
c_sidi90 Hibernate Problem Table doesnt excist Datenbankprogrammierung 8
M Problem mit JPA - OneToMany-Relation Datenbankprogrammierung 3
I Hibernate: Composite Foreign Key Problem Datenbankprogrammierung 14
S JPA OptimisticLocking Problem Datenbankprogrammierung 11
I Derby/JavaDB Problem mit Befüllung von Tabelle Datenbankprogrammierung 7
JavaKaffee Derby/JavaDB Quartz-WebAnwendung - Connection/Treiber Problem Datenbankprogrammierung 47
I Problem mit ResultSet Datenbankprogrammierung 2
L Excel in MySQL importieren Problem Datenbankprogrammierung 5
S Problem beim Anlegen einer Tabelle Datenbankprogrammierung 5
R MS Access mit Java Problem mit Update Statment Datenbankprogrammierung 13
S MySQL Problem mit SELECT bzw encoding Datenbankprogrammierung 4
T Problem beim schreiben von daten Datenbankprogrammierung 4
M MySQL getConnection - Verbindung Problem Datenbankprogrammierung 2
K Hibernate + MySQL Problem... Datenbankprogrammierung 2
I MySQL MySQL – Proxy Problem Datenbankprogrammierung 4
M Problem mit Hibernate und Named Query Datenbankprogrammierung 1
M Problem mit Hibernate und Access Datenbankprogrammierung 9
C firebird problem Datenbankprogrammierung 5
F Problem mit Datenbankabfrage Datenbankprogrammierung 7
K SQL Problem mit Date Datenbankprogrammierung 3
jeppi MySQL Design-Problem: DB-Verbindung herstellen und halten - JdbcRowSet / Idle-Timeout? Datenbankprogrammierung 9
J sql abfrage ... Problem mit Datumswert Datenbankprogrammierung 3
G MySQL Connection Problem Datenbankprogrammierung 3
O MySQL Problem mit Umlauten?! Datenbankprogrammierung 2
E Hibernate Problem bei bidirektionaler 1:n Verbindung Datenbankprogrammierung 2
D MySQL Problem beim einfügen von Double-Zahlen Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
T Problem bei Zugriff auf Access Datenbank Datenbankprogrammierung 7
W jpmdbc Problem -Beispiel funktioniert nicht Datenbankprogrammierung 9
W Verständnis-Problem JPA Grundlagen Datenbankprogrammierung 5
M Problem Array in BLOB-Feld in DerbyDB zu speichern Datenbankprogrammierung 5
M JPA-Persist Problem Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben