MySQL OutOfMemoryError: Java heap space

schranze

Mitglied
Hallo ich habe folgendes Programm geschrieben. Es lädt lokal ausgewählte Dateien in eine linkedlist und schickt diese angepasste Datenmenge an die Datenbank. So sehen die beiden Quelldaten aus

Java:
package dblesen;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.sql.*;

public class Dateilesen {

	 final String clock;
	    final Double bid;
	    final Integer stunde, minute, sekunde;

	    public Dateilesen(Double bid,
	                      Integer stunde,
	                      Integer minute,
	                      Integer sekunde,
	                      String clock)
	    {
	    	this.bid = bid;
	    	this.stunde = stunde;
	        this.minute = minute;
	        this.sekunde = sekunde;
	        this.clock = clock;
	    }


	    public String getclock()
	    {
	        return clock;
	    }
	    

	    public Double getbid()
	    {
	        return bid;
	    }
  
	    public int getstunde()
	    {
	        return stunde;
	    }
	    
	    public int getminute()
	    {
	        return minute;
	    }
	    
	    public int getsekunde()
	    {
	        return sekunde;
	    }
	    public static Dateilesen parseLine( String line )
	    {
	        // Split line on ',' (tokens must not contain ',' otherwise this won't work!)
	        String[] tokens = line.split( "," );

	        if ( tokens.length == 4 )
	        {
	            String date   = tokens[0].trim();

	            String time   = tokens[1].trim();
	      
	           	String stunde = time.substring(0, 2);
	            String minute = time.substring(3, 5);
	            String sekunde = time.substring(6, 8);
	           	
	            String bid  = tokens[2].trim();
	            String ask = tokens[3].trim();

	            String clock = stunde+minute+sekunde;

	            return new Dateilesen(Double.valueOf( bid ),
	                                  Integer.valueOf( stunde),
	                                  Integer.valueOf( minute),
	                                  Integer.valueOf( sekunde),
	                                  clock);
	        }
	        else
	        {
	            throw new RuntimeException( "Wrong number of tokens in line: " + line );
	        }
	    }


	    public static void datendb(String dat, String hn, String po, String db, String us, String pwd, String tabe)
	    {
	        List<Dateilesen> items = new LinkedList<Dateilesen>();


	        try {

	        	BufferedReader fileIn =
	        	new BufferedReader(new FileReader(dat));


	        	String in = fileIn.readLine() ;
	        	while(in!=null) {
	                Dateilesen item = Dateilesen.parseLine( in );
	                items.add( item );
	        		in = fileIn.readLine() ;

	        	} /* End of while */

	        	} catch(IOException ioe) {
	        	ioe.printStackTrace() ;
	        	}
	        


	        // Uebergabe an Datenbank all items
	        	Connection con = null;
	        			try{
	        				String url = "jdbc:mysql://"+hn+":"+po+"/"+db; 
	        			    Class.forName("com.mysql.jdbc.Driver");
	        			    con = DriverManager.getConnection(url, us, pwd);

        					Statement st = con.createStatement();

        					String table = "CREATE TABLE IF NOT EXISTS "+tabe+" (Datum VARCHAR(30), Geld double)";
        					st.executeUpdate(table);
	        			    try{
	    	        	        

	    	    	        	for ( Dateilesen item : items ){

	    	    	        			
	        					String sql = "INSERT into "+tabe+" (Datum, Geld) VALUES(?,?)";
	        					PreparedStatement prest = con.prepareStatement(sql);

	        					String dat1 = item.getclock();
//	        					System.out.println(dat1);
	        					prest.setString(1, dat1);
	        					
	        					Double dat2 = item.getbid();
	        					prest.setDouble(2, dat2);
	        					
	        					prest.executeUpdate();

	    	        }
	    	    	        	System.out.println("Finished");
	        					con.close();
	        				}
	        				catch (SQLException s){
	        					System.out.println("SQL statement is not executed!");
	        				}
	        			}
	        			catch (Exception e){
	        				e.printStackTrace();
	        			}
	        	
	    }
	}

und das wie es grafisch aufgerufen wird

Java:
import dblesen.*;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Hauptproggi extends JFrame {
  /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
JFileChooser chooser = new JFileChooser();
  JButton button = new JButton("Datenquelle");

  public Hauptproggi() {
    super("Upload Kursdaten an Datenbank");
    Container contentPane = getContentPane();

    contentPane.setLayout(new FlowLayout());
    contentPane.add(button);    
    FileFilter filter = new FileNameExtensionFilter("txt files", "txt");
    chooser.addChoosableFileFilter(filter);
    chooser.setMultiSelectionEnabled(true);

    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        int state = chooser.showOpenDialog(null);
        File[] files = chooser.getSelectedFiles();
        String[] filenames = getDateiname(files);

        if(filenames != null &&
          state == JFileChooser.APPROVE_OPTION) {
          JOptionPane.showMessageDialog(null,filenames);
        }
        else if(state == JFileChooser.CANCEL_OPTION) {
          JOptionPane.showMessageDialog(
                      null, "Aktion abgebrochen");
        }
        else if(state == JFileChooser.ERROR_OPTION) {
          JOptionPane.showMessageDialog(
                      null, "Fehler!");
        }
      }
    });
  }
  private String[] getDateiname(File[] files) {
    String[] filenames = null;
    int numFiles = files.length;

    if(files.length > 0) {
       filenames = new String[numFiles];

      for(int i=0; i < numFiles; ++i) {
        filenames[i] = files[i].getAbsolutePath();
//        System.out.println("fertig");
        System.out.println(filenames[i]);
        String datei = filenames[i];
	    String hostname = "localhost"; 
	    String port = "3306"; 
	    String dbname = "mysql"; 
	    String user = "root"; 
	    String password = "test";
	    String tabelle = "daten";
        Dateilesen.datendb(datei, hostname, port, dbname, user, password, tabelle);

      }
    }
    return filenames;
  }
  
  public static void main(String args[]) {

    JFrame f = new Hauptproggi();
    f.setBounds(300,300,350,100);
    f.setVisible(true);

    f.setDefaultCloseOperation(
      WindowConstants.DISPOSE_ON_CLOSE);
  
    f.addWindowListener(new WindowAdapter() {
      public void windowClosed(WindowEvent e) {
        System.exit(0);  
      }
    });
  }
}


Bei kleineren Dateien kann ich ohne Probleme diese Files an die Datenbank senden. Wenn das File 5MB groß ist, werden ca. 20% der Daten gesendet und dann kommt der Fehler

"Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space"

Lasse ich das Datenbank senden weg, im Quelltext alles nach
"// Uebergabe an Datenbank all items"
dann funktioniert es.


Ich habe die Vermutung ich darf die linkedlist bei der Datenübergabe so nicht machen - in dem Sinne benötige ich die linkedlist nicht wirklich - ist nur die Frage, wie ich die Daten konvertiert ohne linkedlist direkt in die Datenbank übermitteln kann. Da würde sich nirgends ne linkedlist aufblähen die zu viel Speicher weg nimmt.

An den Werte habe ich auch schon durchprobiert. Leider erhalte ich immer noch den gleichen Fehler.
java -Xms<initial heap size> -Xmx<maximum heap size>

Danke für Hilfe schon mal im Voraus!
 

fastjack

Top Contributor
Ich würde einfach zeilenweise in die DB schreiben. Also eine Zeile aus der Datei lesen, in die DB schreiben, nächste Zeile.
Die Connection brauchst Du dazu auch nur einmal bei Programmstart zu öffnen und am Programmende zu schliessen. Wenn Transaktionen erforderlich sind, einfach zu Programmbeginn eine aufmachen und am Ende committen. Falls Lesefehler entstehen, rollback ausführen, fertig.
 

schranze

Mitglied
Manchmal sieht man den Wald vor lauter Bäumen nicht - Zeilenweise ist ne sehr gute Idee - bin grad am überlegen wie ich das am sinnvollsten in die Schleife packen soll.

File öffen
Datenbankconnection herstellen
-Schleife
-zeile einlesen
-splitten
-Werte an Datenbank senden
Datenbankconnection schließen
File schließen

Würde das so Sinn machen?


PS rollback sagt mir so erstmal nix - muss ich mal recherchieren was das macht
 
G

Gast2

Gast
Nebenbei - der Sinn von PreparedStatements ist es das sie öfter ausgeführt werden. Nicht immer wieder für einen Aufruf neu erstellt werden. Evlt löst das schon dein Problem:

Java:
                            try{
                                
                                String sql = "INSERT into "+tabe+" (Datum, Geld) VALUES(?,?)";
                                PreparedStatement prest = con.prepareStatement(sql);

                                for ( Dateilesen item : items ){
                                String dat1 = item.getclock();
//                              System.out.println(dat1);
                                prest.setString(1, dat1);                  
                                Double dat2 = item.getbid();
                                prest.setDouble(2, dat2);
                                prest.executeUpdate();
                               }
                                System.out.println("Finished");
                                
                            } catch (SQLException s){
                                System.out.println("SQL statement is not executed!");
                            } finally {
                               prest.close();
                               con.close();
                            }

Weiterer Tip: Für commit und rollback brauchst du eine Transaktionsengine in der Datenbank, also bei MySQL InnoDB => InnoDB ? Wikipedia
 
Zuletzt bearbeitet von einem Moderator:

schranze

Mitglied
Hi fassy - Danke für den Tipp! Die 2 Zeilen aus der Schleife nehmen macht Sinn! Es klappt wenn ich das so abändere. :applaus:

Mit dem Zeilenweise wird auf dem Zettel notiert. Werde das dahin gehend abändern, weil Resourcen schonender. Das ist ja der Sinn und Zweck bei der Software-Entwicklung.

Nochmal Danke Danke! @fastjack & @fassy
einfach nur Spitze
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D outOfMemoryError: Java heap space Datenbankprogrammierung 8
J OutOfMemoryError - Wie verhindern? Datenbankprogrammierung 4
Juelin Java und MySQL MariaDB - WHERE-Klausel Datenbankprogrammierung 17
P Reicht finally nicht um DB connections zu schließen in (altem) Java? Datenbankprogrammierung 4
A Java DB Server lässt sich nicht starten Datenbankprogrammierung 3
TheSkyRider MySQL Datenbankzuordnung in Verbindung mit Java Datenbankprogrammierung 7
U SQL Server mit Java verbinden Datenbankprogrammierung 5
D SQLite Datenbank in Android Studio (Java) durchsuchen Datenbankprogrammierung 3
TH260199 Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung. Datenbankprogrammierung 7
S Das printen der Ausgabe des Oracle-SQL-Statements in der Java-Eclipse-Konsole funktioniert nicht Datenbankprogrammierung 6
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Noobfrage: Konvertierung von SQL-Datentyp 'timestamp with time zone' in Java-Datentyp Datenbankprogrammierung 3
Zrebna Lediglich interne DB-Verbindungen (Connections) auslesen - mittels Java Datenbankprogrammierung 4
berserkerdq2 Was genau muss ich bei date eingeben, wenn ich in Java eine Spalte definiere, die date ist? Datenbankprogrammierung 1
berserkerdq2 Was kann passieren, wenn ich in java einstelle, dass der Fremdschüssel ein Attribut ist, welches selber kein Primärschlüssel ist? Datenbankprogrammierung 4
berserkerdq2 Foreign key einstellen java Datenbankprogrammierung 4
nikgo Java SQL Ausgabe in Liste o.ä. abspeichern um mit dem Ergbnis "zu arbeiten"? Datenbankprogrammierung 5
S Datenbankprogrammierung in Java unter NetBeans 12 funktioniert nicht! Datenbankprogrammierung 1
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
S ODBC Treiber in Java Editor einbinden Datenbankprogrammierung 3
H Oracle Resize eines Images in Java und Rückgabe des Image als BLOB an die Oracle Datebank Datenbankprogrammierung 14
H Java Class zum komprimieren von Jpeg-Images zum Einbinden in Oracle DB - Bild als blob (in und out) Datenbankprogrammierung 23
V SQLite java.sql.SQLException: no such column: Datenbankprogrammierung 18
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
D Daten aus der Firebase-Echtzeitdatenbank abfragen und in Variablen speichern (JAVA) Datenbankprogrammierung 0
Slaylen Java List Suchen mit eigenem Generischen Datentyp Datenbankprogrammierung 10
N java sql abfrage bestimmer Datumszeitraum Datenbankprogrammierung 9
D SQL Server Android App: 'int java.lang.String.length()' on a null object reference Datenbankprogrammierung 15
P USER Management in SQL übergreifend auf JAVA Programm Datenbankprogrammierung 1
H MySQL Verbindung Datenbank und Eclipse (Java) Datenbankprogrammierung 5
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
N Java, sql, jar, JDBC-Treiber in Classpath Datenbankprogrammierung 8
N java SQL JAR - Probleme Datenbankprogrammierung 18
N SQL Datenbank Spalte in Java Array Datenbankprogrammierung 2
N SQL-Statement Java Variable in SQL DB einfügen Datenbankprogrammierung 1
S Verbindung von einer Excel Datei zu Java Datenbankprogrammierung 2
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
T Java Spiel Daten speichern Datenbankprogrammierung 1
C Java MySQL check if value exists in database Datenbankprogrammierung 2
N Sqlite DB mit Java wird auf Linuxsystem nicht gefunden Datenbankprogrammierung 9
L Mybatis Datenbankabfragen in Java Datenbankprogrammierung 1
H MariaDB-Zugriff mittels Java SE Datenbankprogrammierung 3
J Java fügt Datensätze ein aber diese werden nicht richtig abgefragt Datenbankprogrammierung 3
S Datenbank MySQL und Java Datenbankprogrammierung 8
S Beispiel-Blockchain + GUI mit Java erstellen Datenbankprogrammierung 0
P Adressadministration mit Java und mySQL Datenbankprogrammierung 14
Trèfle SQLite SQL-Java Änderungen ausgeben Datenbankprogrammierung 1
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
A MySQL Select und Insert in Java Datenbankprogrammierung 15
C Derby/JavaDB Auf Variable aus Link in java server page zugreifen Datenbankprogrammierung 4
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
F MySQL Einfügen von Datensätzen über Java Datenbankprogrammierung 8
B CSV in Java einbinden und Rechnung Datenbankprogrammierung 7
L Speicherverbrauch Java Anwendung mit einer Datenbankanbindung Datenbankprogrammierung 19
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
L Java- Zähle alle Werte aus der Tabelle von aktiver Zelle Datenbankprogrammierung 12
S Datenbank/Java true/false Datenbankprogrammierung 8
S Java und SQL-Befehle Datenbankprogrammierung 6
L INSERT INTO Befehl in Java Datenbankprogrammierung 8
L Datenbankprogrammierung mit Java und phpMyAdmin Datenbankprogrammierung 4
Korvinus Java mit Cassandra verbinden Datenbankprogrammierung 18
M SQL-Statement SQL mit Java, Update Fehler Datenbankprogrammierung 1
D Installation von MariaDB in java und eclipse Datenbankprogrammierung 2
H Datenbank Export mit Java Datenbankprogrammierung 3
I MariaDB-Verbindung in JAVA Datenbankprogrammierung 11
L Oracle Datenbank über Java aufrufen Datenbankprogrammierung 29
W Daten in Java intern abfragen Datenbankprogrammierung 1
W MySQL Ausgabe von Datenbank in Java-App Datenbankprogrammierung 6
D Java Datenbanken Datenbankprogrammierung 1
Y H2 H2 foreign key in Spark Java ausgeben Datenbankprogrammierung 1
J Java Eclipse Hilfe beim Programmieren Datenbankprogrammierung 7
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
R Java-Befehle/Operatoren für copy&paste Datenbankprogrammierung 2
C Mit asm laufende Java Anwendung manipulieren Datenbankprogrammierung 1
W Wie liest dieses Java-Programm der Compiler? Datenbankprogrammierung 3
K Java Datenbank auslesen Datenbankprogrammierung 8
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
K HSQLDB .sql Script Aufruf über Java Datenbankprogrammierung 7
B Java Programm und Dantebank umlagern Datenbankprogrammierung 25
B MySQL bplaced Datenbank mit Java ansprechen Datenbankprogrammierung 11
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
F Java Objekte in einer Datenbank speichern Datenbankprogrammierung 4
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
O PostgreSQL Java Row Index erhalten Datenbankprogrammierung 1
dzim Cassandra Cluster DB und der Java-Treiber Datenbankprogrammierung 1
H Entity in Java implementieren Datenbankprogrammierung 13
V Fehler beim Generierung Fehler beim Generierung java.lang.ArrayIndexOutOfBoundsException: 0 Datenbankprogrammierung 12
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
D MySQL Many to Many Tabellen in Java abbilden? Datenbankprogrammierung 4
P Datanbank für Java-Programmierung Datenbankprogrammierung 10
F Java SQLite Error Datenbankprogrammierung 19
F SQL Datenbank an Java Code anbinden Datenbankprogrammierung 5
J Java 8 und Microsoft Access Database-Dateien(mdb) Datenbankprogrammierung 1
H HSQLDB Beim öffnen folgender Fehler: ... java.lang.NullPointerException Datenbankprogrammierung 1
H SHOW Tables in Java/MySQL Datenbankprogrammierung 8
M Verbindung von Java Programm zur Acccess Datenbank (mdb-Datei) Datenbankprogrammierung 0
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
M Wie übergebe ich Datenbankobjekte aus einer sql-Datenbank einer Java Klasse bzw. Instanz Datenbankprogrammierung 7
D Zeit von SQL nach Java Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben