Hallo,
Ich bin gerade dabei ein Programm in Java zu schreiben, in welchem ich aus einer Textdatei ca. 10Mio. Datensetze (Zeilen) mit je X,Y,Z Koordinaten in eine MySQL Datenbank importieren möchte.
Leider kommt immer zwischen 300.000 und 400.000 übertragenen Datensetzen eine Fehlermeldung und die Übertragung bricht ab. Mit Datenbanken und Java habe ich bisher wenig Erfahrung. Wie geht man so eine große „Übertragung“ denn am besten an? Wie gesagt, er bricht ja nur irgendwann ab, sprich die Übertragung funktioniert. Habe es schon mit commit versucht, aber da autocommit aktiviert ist, sollte es ja auch so funktionieren. Wäre nett, wenn mir jemand weiterhelfen könnte.
Die Fehlermeldung:
Exception in thread „AWT-EventQueue-0“ java.lang.ArrayIndexOutOfBoundsException: 1
at bachelorarbeit_gut.ProgramFrame.fileOpen(ProgramFrame.java:141)
at bachelorarbeit_gut.ProgramFrame$1.actionPerformed(ProgramFrame.java:60)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1223)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1264)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
ERSTELLEN ERFOLGREICH (Gesamtzeit: 25 Minuten 40 Sekunden)
Mit Datenbanken und Java habe ich bisher wenig Erfahrung. Wie
geht man so eine große „Übertragung“ denn am besten an?
Stichwort Batch-Verarbeitung, ist i.d.R. performanter als die Updates einzeln zu verarbeiten (sofern MySQL das unterstützt, bin ich spontan überfragt): http://java.sun.com/developer/Books/JDBCTutorial/ 3.4 Making Batch Updates
Aber…
Die Fehlermeldung:
Exception in thread „AWT-EventQueue-0“
java.lang.ArrayIndexOutOfBoundsException: 1
at
bachelorarbeit_gut.ProgramFrame.fileOpen(ProgramFrame.java:141)
bedeutet schlicht, dass du versuchst auf einen Array Index zuzugreifen, den es nicht gibt. Also entweder negativ oder größer als die Array-Größe. Kann mir spontan nicht vorstellen, dass es mit der Anzahl der verarbeiteten Datensätze zusammenhängt. Was steht den in Zeile 141 in ProgramFrame.java? Auf welches Array greifst du mit welchem index zu?
Hallo,
Ich bin gerade dabei ein Programm in Java zu schreiben, in
welchem ich aus einer Textdatei ca. 10Mio. Datensetze (Zeilen)
mit je X,Y,Z Koordinaten in eine MySQL Datenbank importieren
möchte.
Leider kommt immer zwischen 300.000 und 400.000 übertragenen
Datensetzen eine Fehlermeldung und die Übertragung bricht ab.
Mit Datenbanken und Java habe ich bisher wenig Erfahrung. Wie
geht man so eine große „Übertragung“ denn am besten an? Wie
gesagt, er bricht ja nur irgendwann ab, sprich die Übertragung
funktioniert. Habe es schon mit commit versucht, aber da
autocommit aktiviert ist, sollte es ja auch so funktionieren.
Wäre nett, wenn mir jemand weiterhelfen könnte.
Die Fehlermeldung:
Exception in thread „AWT-EventQueue-0“
java.lang.ArrayIndexOutOfBoundsException: 1
Diese Klasse dient zur Auslösung einer ArrayIndexOutOfBoundsException. Die ArrayIndexOutOfBoundsException tritt auf, wenn versucht wird, ein Array mit einem ungültigen Index anzusprechen
Danke für die schnelle Antwort!
In zeile 141 steht:
141: String teile[] = new String[3];
142: teile = line.split("\s");
Kann es sein, dass du die Source-Datei nicht mehr zum Programm passt? In der Zeile findet kein Zugriff auf das Array statt, da kann es eigentlich nicht zu einer ArrayIndexOutOfBoundsException kommen. Evtl. nochmal kompilieren und prüfen, ob sich die Zeilennummer in der Fehlermeldung ändert.
Ich Teile also jede Zeile mit Split auf (nach jedem
Leerzeichen) und füge diesen Wert teile[] zu…
Vielleicht gibt es ja da die Lösung!?
Meine letztes Posting war nicht ganz richtig, das Array kann ein Element enthalten, die Index Position in der Fehlermeldung lautet ja 1, d.h. du versuchst auf das zweite Element zuzugreifen. Wenn die Zeile kein Leerzeichen enthält hat das Array aber nur ein Element, das würde die Fehlermeldung erklären. Du solltest das also zuvor prüfen, bevor du auf die Strings zugreifst.
Ich glaube, den Fehler gefunden zu haben!
In der Datei gibt es Zeilen, in denen nur ein Wert steht.
Die Frage ist nur, wie fische ich diese Zeilen raus? bzw. Zeilen ohne Inhalt?