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
und das wie es grafisch aufgerufen wird
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!
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!