Swing DB Zugriff mit JProgressBar?!

ElJarno

Bekanntes Mitglied
Hi Leute,
in meinem jetztigen Programm geht es darum, dass ich größere Datenmengen in eine DB speichere. Um den Benutzer zu informieren wie weit die Abarbeitung ist, wollte ich ein JProgressBar implementieren. Aufgrund des bekannten Problems mit der Sichtbarkeit und der Threads wollte ich nun irgendwie die Schleifenabarbeitung in ein Thread-Objekt auslagern Hier mal der ürsprüngliche Code:

Java:
	public void insertBinaerDaten(String dateiID, int packetGroesse, File datei)
			throws SQLException, IOException {
		BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(datei));
		long dateiGroesse = datei.length();
		int partNr = 0;
		if (dateiGroesse <= Integer.MAX_VALUE) {
			int bytesLeft = (int) dateiGroesse;
			this.edStatusBar.getProgressBar2().setMinimum(0);
			this.edStatusBar.getProgressBar2().setMaximum(bytesLeft);
			
			
			while (bytesLeft > 0) {
				String objid = ObjectID.getOBJID(199);

				java.sql.PreparedStatement ps = this.getConnection().prepareStatement(
						"INSERT into " + paketDatenTabelle + " VALUES(?,?,?,?,?)");
				ps.setString(1, objid);
				ps.setString(2, dateiID);
				ps.setInt(3, partNr);
				ps.setInt(4, packetGroesse);
				ps.setBinaryStream(5, inputStream, packetGroesse);
				ps.execute();
				ps.close();
				partNr += 1;
				bytesLeft -= packetGroesse;
				this.edStatusBar.getProgressBar2().setValue(
						this.edStatusBar.getProgressBar2().getMaximum() - bytesLeft);
			}
			inputStream.close();
		} else {
			this.edStatusBar.getProgressBar2().setValue(0);
			throw new IOException("Datei ist zu groß! " + datei.getName());
		}
	}

Und hier der Versuch die Schleife in den Thread auszulagern.

Java:
	public void insertBinaerDaten(String dateiID, int packetGroesse, File datei)
			throws SQLException, IOException {
		BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(datei));
		long dateiGroesse = datei.length();
		int partNr = 0;
		if (dateiGroesse <= Integer.MAX_VALUE) {
			int bytesLeft = (int) dateiGroesse;
			this.edStatusBar.getProgressBar2().setMinimum(0);
			this.edStatusBar.getProgressBar2().setMaximum(bytesLeft);

			new Thread(new Runnable() {
				public void run() {
					while (bytesLeft > 0) {
						String objid = ObjectID.getOBJID(199);

						java.sql.PreparedStatement ps = getConnection().prepareStatement(
								"INSERT into " + paketDatenTabelle + " VALUES(?,?,?,?,?)");
						ps.setString(1, objid);
						ps.setString(2, dateiID);
						ps.setInt(3, partNr);
						ps.setInt(4, packetGroesse);
						ps.setBinaryStream(5, inputStream, packetGroesse);
						ps.execute();
						ps.close();
						partNr += 1;
						bytesLeft -= packetGroesse;

						SwingUtilities.invokeLater(new Runnable() {
							public void run() {
								edStatusBar.getProgressBar2().setValue(
										edStatusBar.getProgressBar2().getMaximum() - bytesLeft);
							}
						});

					}
					inputStream.close();
				}
			}).start();
		} else {
			this.edStatusBar.getProgressBar2().setValue(0);
			throw new IOException("Datei ist zu groß! " + datei.getName());
		}
	}

Problem hierbei ist nun die Sichtbarkeit der lokalen Variablen in der Methode die ja in dem Thread-Objekt nicht Sichtbar sind, wollte jetzt nicht unbedingt alle lokalen Variablen global zwischenspeichern. Was noch viel problematischer dabei ist, dass man die Exceptions nicht weiterreichen kann. Und da weiß ich wriklich nicht wie ich das Problem lösen soll.
Ein kongrete Code-Hilfe würde mir echt weiter helfen da ich mich mit Threads noch nicht wirklich befasst habe.

Gruß Jan:)
 
Zuletzt bearbeitet:

Niki

Top Contributor
mach die Variablen final bzw. vor dem Thread verwende zusätzliche final Variablen. so z.B:

Java:
int i = 0;
i=i+10;

//usw....

final int x = i;
new Thread(new Runnable(){
  public void run(){
    //hier kann x verwendet, jedoch nicht verändert werden!
  }
}).start();
 

ElJarno

Bekanntes Mitglied
Oke stimmt:). Aber was ist mit der Exceptions Geschicht würd die ungern in dem Thread abfangen bzw. brauch ich die in den anderen Methoden. Konkret. Ich schreibe die Datenpakete in eine Tabelle und die Kopfdaten dazu(Dateityp,Größe etc.) in eine andere Tabelle. Wenn jetzt nun eine Exception beim Schreiben der Daten in die Datentabelle ausgelöst wird, lösche ich den Datensatz für die kopfdaten wieder aus der Tabelle. Gibts ne andere Möglichkeit aus dem Thread heraus sowas auszulösen als über das Weiterreichen der Exception mittels Throw.

Gruß Jan
 

Michael...

Top Contributor
Ich schreibe die Datenpakete in eine Tabelle und die Kopfdaten dazu(Dateityp,Größe etc.) in eine andere Tabelle. Wenn jetzt nun eine Exception beim Schreiben der Daten in die Datentabelle ausgelöst wird, lösche ich den Datensatz für die kopfdaten wieder aus der Tabelle. Gibts ne andere Möglichkeit aus dem Thread heraus sowas auszulösen als über das Weiterreichen der Exception mittels Throw.
Mir ist Dein Problem nicht ganz klar. Warum schreibst Du die Kopfdaten nicht unmittelbar vor oder nach den Daten in die Datenbank. Wenn Du die Kopfdaten nach den Daten in die Datenbank schreibst, werden diese bei auftreten eines Fehlers erst gar nicht geschrieben. Werden die Kopfdaten zuerst angelegt, kannst Du ja beim Auftreten eines Fehlers ein rollback auf der Datenbank aufrufen, im Erfolgsfall ein commit - dabei darf selbstverständlich kein autocommit o.ä. gesetzt sein.
 

ElJarno

Bekanntes Mitglied
Das mit dem Commit und Rollback habe ich bisher in der java.sql.connection Klasse nicht gefunden. Außerdem erst alle Datenmengen zu sammeln und zum Schluss erst zu commiten würde wieder das Problem von zu viel Speichernutzung nach sich ziehen. wie gesagt es handelt sich ja um große Datenmengen. Und die Exception im Thread muss ich ja über cathc abfangen. Sprich der Code laüft ja ganz normal weiter also wird auch der Kopf-DS angelegt selbst wenn ich es hinterher mache.
Hier mal die Thread-Klasse die ich jetzt Probeweise erstellt habe.

Java:
package com.ed.jl.DB;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;

import javax.swing.SwingUtilities;

import com.ed.bp.ObjectIDManager.ObjectID;
import com.ed.jl.EDToolBar.EDStatusBar;
import com.ed.jl.MySQL.DBConnectMySQL;

public class InsertBinaerDaten extends DBConnectMySQL implements Runnable {
	public final static String paketDatenTabelle = "DATEIEN_BINAER_PAKETE";
	private String dateiID;
	private int packetGroesse;
	private File datei;
	private int bytesLeft;
	private EDStatusBar edStatusBar;

	public InsertBinaerDaten(String dateiID, int packetGroesse, File datei, EDStatusBar edStatusBar) {
		this.dateiID = dateiID;
		this.packetGroesse = packetGroesse;
		this.datei = datei;
		this.edStatusBar = edStatusBar;
	}

	public void run() {
		try {
			this.setConnection();
			this.test();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			this.closeConnection();
		}
	}

	private void test() throws IOException, SQLException {
		BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(datei));
		long dateiGroesse = datei.length();
		int partNr = 0;
		if (dateiGroesse <= Integer.MAX_VALUE) {
			bytesLeft = (int) dateiGroesse;
			edStatusBar.getProgressBar2().setMinimum(0);
			edStatusBar.getProgressBar2().setMaximum(bytesLeft);
			while (bytesLeft > 0) {
				String objid = ObjectID.getOBJID(199);

				java.sql.PreparedStatement ps = getConnection().prepareStatement(
						"INSERT into " + paketDatenTabelle + " VALUES(?,?,?,?,?)");
				ps.setString(1, objid);
				ps.setString(2, dateiID);
				ps.setInt(3, partNr);
				ps.setInt(4, packetGroesse);
				ps.setBinaryStream(5, inputStream, packetGroesse);
				ps.execute();
				ps.close();
				partNr += 1;
				bytesLeft -= packetGroesse;

//				SwingUtilities.invokeLater(new Runnable() {
//					public void run() {
						edStatusBar.getProgressBar2().setValue(
								edStatusBar.getProgressBar2().getMaximum() - bytesLeft);
//					}
//				});

			}
			inputStream.close();
		} else {
			edStatusBar.getProgressBar2().setValue(0);
			throw new IOException("Datei ist zu groß! " + datei.getName());
		}
	}
}

Und hier der Aufruf:

Java:
			InsertBinaerDaten insert = new InsertBinaerDaten(dateiID, packetGroesse, datei,
					this.edStatusbar);
			Thread thr = new Thread(insert);
			thr.start();

Habe hier nun auch noch das Problem dass wenn ich verusche auf den insert InvokeAndWait anzuwenden, dass ich hier auch eine Exception bekomme. Ne Idee?

Danke schon mal für die schnelle Hilfe bis jetzt:toll:
 

Michael...

Top Contributor
Hab jetzt nicht alles durchgelesen
Das mit dem Commit und Rollback habe ich bisher in der java.sql.connection Klasse nicht gefunden.
Sicherlich kann man das commit bzw. rollback auch per Statement auf der Datenbank ausführen lassen.
Außerdem erst alle Datenmengen zu sammeln und zum Schluss erst zu commiten würde wieder das Problem von zu viel Speichernutzung nach sich ziehen. wie gesagt es handelt sich ja um große Datenmengen.
??? Was meinst Du mit Sammeln und Speichernutzung? Du schiebst die Daten ja in die Datenbank - in der Umgebung muss ja genügend Speicher zur Verfügung stehen
Und die Exception im Thread muss ich ja über cathc abfangen. Sprich der Code laüft ja ganz normal weiter also wird auch der Kopf-DS angelegt selbst wenn ich es hinterher mache.
Du kannst ja die genauso Kopfdaten im Thread - z.B. nach der while Schleife - anlegen
 

ElJarno

Bekanntes Mitglied
Hi,
habs jetzt aber hinbekommen. Hab einfach die in der Hierarchie oberset Methode in einen Thread gepackt und alles andere so belassen wies war. Also im Prinzip in die Listener-Methode den Thread miteingebaut.

Gruß Jan
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
L JavaFX Zugriff auf HostServices im FXML Controller AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
J JavaFX Zugriff auf Child AWT, Swing, JavaFX & SWT 4
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
C JavaFX Zugriff auf TextField aus einer anderen Klasse AWT, Swing, JavaFX & SWT 4
wolfgang63 JavaFX Zugriff auf Guiobjekte die über FXML erstellt wurden AWT, Swing, JavaFX & SWT 2
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
C JavaFX Zugriff auf TableView AWT, Swing, JavaFX & SWT 2
D JavaFX Zugriff auf Controller erlangen AWT, Swing, JavaFX & SWT 4
L Zugriff auf JavaFX Controls AWT, Swing, JavaFX & SWT 3
G JavaFX NullPointerException bei Zugriff auf FXML Element AWT, Swing, JavaFX & SWT 0
P Event Handling Anfängerfrage: ActionEvent bekommt kein Zugriff auf Objekt AWT, Swing, JavaFX & SWT 3
H SWT NullPointerException bei Zugriff auf Variablen des Hauptfensters AWT, Swing, JavaFX & SWT 6
K Zugriff auf Label und Ereignisbehandlung durch zwei Handlerklassen AWT, Swing, JavaFX & SWT 3
B Zugriff auf JFrame obwohl die Klasse abgeleitet ist AWT, Swing, JavaFX & SWT 3
V JTable: Zugriff auf einzelne Zellen AWT, Swing, JavaFX & SWT 4
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
A Swing Zugriff auf JButton AWT, Swing, JavaFX & SWT 2
M Zugriff auf Variablen eines Objektes ohne sie auf static zu setzen AWT, Swing, JavaFX & SWT 9
I Swing Zugriff auf ein Objekt AWT, Swing, JavaFX & SWT 2
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
N zugriff auf frame AWT, Swing, JavaFX & SWT 5
N Swing Zugriff JButton auf JTree AWT, Swing, JavaFX & SWT 4
D Zugriff auf Instanz der GUI AWT, Swing, JavaFX & SWT 3
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
H Zugriff JPanel AWT, Swing, JavaFX & SWT 3
D Swing Storage von / Zugriff auf und durch Actions AWT, Swing, JavaFX & SWT 5
S this-Zugriff auf Container höherer Ebene AWT, Swing, JavaFX & SWT 2
S Swing Zugriff auf Polyline in Grafik AWT, Swing, JavaFX & SWT 4
E Swing Zugriff auf Attribute eines JFrames über einen JDialog AWT, Swing, JavaFX & SWT 2
J Zugriff auf HtmlPanel sperren AWT, Swing, JavaFX & SWT 3
D JTree - Zugriff auf Nodes mit Object AWT, Swing, JavaFX & SWT 6
R Zugriff auf Component um addComponentListener() aufzurufen AWT, Swing, JavaFX & SWT 4
O Zugriff auf PreferenceStore aus der Business-Logik-Schicht? AWT, Swing, JavaFX & SWT 11
S NumberFormatException beim Zugriff auf Leeres JTextField AWT, Swing, JavaFX & SWT 8
S Zugriff auf statische Var in MouseEvent -> Warnung AWT, Swing, JavaFX & SWT 6
M Fehler beim Zugriff von awt-KeyListener auf swt-Shell AWT, Swing, JavaFX & SWT 2
S Zugriff auf Elemente funktioniert mit SWING nicht mehr AWT, Swing, JavaFX & SWT 5
X Zugriff auf "Oberparents" ? AWT, Swing, JavaFX & SWT 4
J JTextArea wird nicht aktualisiert bei Zugriff von außerhalb AWT, Swing, JavaFX & SWT 2
O DB-Zugriff + wie darstellen? AWT, Swing, JavaFX & SWT 6
F Problem bei Zugriff auf ComboBox Item AWT, Swing, JavaFX & SWT 4
G Zugriff auf JTextField AWT, Swing, JavaFX & SWT 2
J Zugriff auf "dynamisch erzeugte" JTextFields AWT, Swing, JavaFX & SWT 2
J Zugriff auf letzte Klasse AWT, Swing, JavaFX & SWT 4
M Zugriff auf Methoden aus einem ActionListener AWT, Swing, JavaFX & SWT 2
F Zugriff auf Oberfläche bzw Trennung GUI / Logik AWT, Swing, JavaFX & SWT 3
I selectedText: Wie bekomme ich Zugriff auf den Text? AWT, Swing, JavaFX & SWT 4
G Zugriff auf Bilder verweigern AWT, Swing, JavaFX & SWT 7
H Zugriff auf die Farbwerte eines Bildes AWT, Swing, JavaFX & SWT 6
G Zugriff auf TextField geht nicht AWT, Swing, JavaFX & SWT 5
G zugriff auf benutzeroberflächenelemente AWT, Swing, JavaFX & SWT 4
V Zugriff auf Components aus einem ActionListener AWT, Swing, JavaFX & SWT 3
M ActionListener-Zugriff durch mehrere Frames AWT, Swing, JavaFX & SWT 5
M Zugriff auf ComboBox! AWT, Swing, JavaFX & SWT 17
G Excel-Zugriff über POI: wohin mit dem Package? AWT, Swing, JavaFX & SWT 4
B Zugriff von Toolbar auf zugehörigen Frame AWT, Swing, JavaFX & SWT 6
O JTabbedPane - Zugriff auf die Elemente eines Tabs AWT, Swing, JavaFX & SWT 4
O JFileChooser - Zugriff auf Dateiname-Feld und Save-Button? AWT, Swing, JavaFX & SWT 6
E Zugriff auf JTextField nach Buttonklick AWT, Swing, JavaFX & SWT 6
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
A Swing JProgressbar im Windows Look & Feel Farbanpassung AWT, Swing, JavaFX & SWT 2
G JProgressBar: Verständnis Problem AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
T Swing JProgressBar mit String unschön AWT, Swing, JavaFX & SWT 5
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
E Swing JProgressBar updaten AWT, Swing, JavaFX & SWT 3
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
V Swing JProgressBar aktualisieren AWT, Swing, JavaFX & SWT 14
M JProgressBar updatet nicht AWT, Swing, JavaFX & SWT 4
T Swing JProgressBar Indeterminate bleibt stehen bei neuem Fenster AWT, Swing, JavaFX & SWT 6
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
J JProgressBar Indeterminate AWT, Swing, JavaFX & SWT 17
J JProgressBar Farbverlauf AWT, Swing, JavaFX & SWT 2
O Probleme mit JProgressBar bei der Statusanzeige AWT, Swing, JavaFX & SWT 5
S jProgressbar von einem Download AWT, Swing, JavaFX & SWT 6
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
S Swing StatusLeiste mit JProgressBar AWT, Swing, JavaFX & SWT 4
S JProgressBar in Abhängigkeit eines FileInputStreams AWT, Swing, JavaFX & SWT 2
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
S Problem mit JProgressBar AWT, Swing, JavaFX & SWT 3
C Swing JProgressBar Aktualisiert sich nicht. AWT, Swing, JavaFX & SWT 9
M JProgressBar Look and Feel AWT, Swing, JavaFX & SWT 5
C JProgressBar und JLabel AWT, Swing, JavaFX & SWT 5
K JProgressBar transparent AWT, Swing, JavaFX & SWT 10
M JProgressBar AWT, Swing, JavaFX & SWT 2
K JProgressBar für Serialisierung AWT, Swing, JavaFX & SWT 6
multiholle [JProgressBar] Raster deaktivieren AWT, Swing, JavaFX & SWT 14
M JProgressBar übereinander legen? AWT, Swing, JavaFX & SWT 3
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben