ResultSet.last() und die GUI friert ein

Kros

Mitglied
Hallo

Ich versuche seit Tagen herauszufinden wieso das Programm immer wieder bei der selben Aktion einfriert.

  • In einer GUI kann ich über ein JComboBox Tabellen aus der Datenbank wählen.
  • In einer JTable werden daraufhin die Daten der Datenbank Tabelle angezeigt.
  • Das Füllen der JTable läuft über eine TableModel.

Das ganze funktioniert auch, bis auf eine Situation, wenn der oberste Eintrag aus dem JComboBox gewählt wird, friert das ganze ein.

Mit einfrieren meine ich, dass keine Fehlermeldung auftritt, dass sich nichts mehr in der GUI anklicken lässt (auch nicht das X vom JFrame zum schlessen) und das Programm sich nur noch mittels 'Terminate' in Eclipse schliessen lässt.

Den Ort des Verbrechens habe ich mittels sysout mal eingegrenzt: Das Problem scheint bei der Zeile 18 aufzutreten.

Java:
public ResultSet executeSelect(String query) {
		this.qrySelect = query;
		System.out.println("Neuer Eintrag in der JComboBox gewählt -> SQL : "+query);
				
		try {
			stmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
					ResultSet.CONCUR_UPDATABLE);

			if (stmt.execute(query)) {
				rs = stmt.getResultSet();
				rsMeta = rs.getMetaData();
				columnCount = rsMeta.getColumnCount();
				
				// Zeilenanzahl
				
				System.out.println("rs.last() wird gestartet --> DBHanlder.executeSelect()");
				try {
					rs.last(); // FIX funktioniert nicht bei der Wahl des Obersten Eintrags in der CobmoBox
					System.out.println("rs.last() hat funktioniert --> DBHanlder.executeSelect()");
				} catch (Exception e) {
					System.out.println("rs.last() ist fehlgeschlagen --> DBHanlder.executeSelect()");
					e.printStackTrace();
				}
				
				rowCount = rs.getRow();
				rs.beforeFirst();
				
			} else
				rs = null;
		} catch (SQLException e) {
			System.out.println("Fehler bei der Datenübergabe von der Datenbank in das ResultSet.");
			e.printStackTrace();
		}

		return rs;
	}

Die Ausgabe in der Konsole sieht wie folgt aus:

Java:
Neuer Eintrag in der JComboBox gewählt -> SQL : SELECT * FROM APP.TBLADRESSE
rs.last() wird gestartet --> DBHanlder.executeSelect()
rs.last() hat funktioniert --> DBHanlder.executeSelect()
Neuer Eintrag in der JComboBox gewählt -> SQL : SELECT * FROM APP.TBLINSTITUTION
rs.last() wird gestartet --> DBHanlder.executeSelect()
rs.last() hat funktioniert --> DBHanlder.executeSelect()
Neuer Eintrag in der JComboBox gewählt -> SQL : SELECT * FROM APP.TBLMATERIAL
rs.last() wird gestartet --> DBHanlder.executeSelect()
rs.last() hat funktioniert --> DBHanlder.executeSelect()
Neuer Eintrag in der JComboBox gewählt -> SQL : SELECT * FROM APP.TBLADRESSE
rs.last() wird gestartet --> DBHanlder.executeSelect()

Der erste Eintrag wird biem Starten des JFrame gesetzt. Wenn ich nun andere Einträge aus der JComboBox auswähle klappt alles. Sobald ich aber wider den ersten Eintrag auswähle, friert es ein.

Hat da jemand eine Idee? Ich gehe davon aus, dass es an rs.last() liegt. Ich weiss aber nicht wo ich noch suchen muss, oder welcher Codeschnippsel noch weiterhelfen könnte.

Grüsse Kris
 
Ohne großartig in deinen Code geguckt zu haben:
Generell friert dir die GUI ein, wenn der EDT damit beschäftigt ist, Code auszuführen. D.h. du solltest den Krams mit dem ResultSet in einen eigenen Thread auslagern.
 
Hmm... hab mich noch nicht mit Threads beschäftigt, wie kann man einen Methodenaufruf in einen Thread auslagern, damit ich das mal Testen kann?

Allerdings bezweifle ich, dass dies die Lösung ist, da das Einfrieren nur dann auftritt, wenn der oberste Eintrag in der JComboBox gewählt wird. Bei allen anderen Einträgen funktioniert es. Auch beim ersten auswählen des obersten Eintrags (was ja automatisch beim erstellen geschieht) funktioniert es.

Hmmm...

EDIT Das mit dem Thread hat funktioniert. Kann man die Ursache irgendwie herausfinden? Dass heisst, wo im Code sich das Prog selbst beschäftigt?
 
Zuletzt bearbeitet:

Zurück
Oben