MySQL Zugriff auf Datenbank Objekt

goodcat

Aktives Mitglied
Hi,

ich habe da mal zwei Fragen was den Zugriff auf das Datenbank Objekt angeht. Und DB Zugriffe in verbindung mit Threads.

Und zwar habe ich mehrere Klassen die auf die Datenbank zugreifen müssen. Diese Klassen bauen die SQL Querys zusammen und schicken diese an den DBConnector.

Ich habe eine Klasse DBConnector.java die folgendermaßen aussieht:

Java:
public class DBConnector {
		
	public MysqlDataSource ds = new MysqlDataSource();	
	public Connection DBConn;
	private Statement stm;
	private ResultSet rs;
	private int DBError = 0;
	
	public DBConnector() {
		
		try {
			ds.setDatabaseName(Main.dbDatabaseName);
			ds.setServerName(Main.dbServerName);
			ds.setPort(Main.dbPort);
			ds.setUser(Main.dbUsername);
			ds.setPassword(Main.dbPassword);
		}
		catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	/**
	 * Schließt die Verbindung zum Datenbank Server.
	 */
	public void closeConnection() {	
		
		try {
			DBConn.close();
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	public ResultSet executeQuery( String query ) {
    	try {
    		this.DBConn = ds.getConnection();
    		this.stm = DBConn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
        	this.rs = stm.executeQuery(query);
    	}
    	catch (CommunicationsException eConn) {
    		if (this.DBError != 1) {
    			JOptionPane.showMessageDialog(null, "ERROR: Could not establish a database connection", "DB Error", JOptionPane.ERROR_MESSAGE);
    		}
    		this.DBError = 1;
    	}
    	catch (Exception e) {
			e.printStackTrace();
		}
    	
    	return this.rs;
	}
	
	public void alterQuery( String query ) {
	     
        try {
        	DBConn = ds.getConnection();
        	stm = DBConn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
        	stm.executeUpdate(query);
        }
        catch(MySQLIntegrityConstraintViolationException e1) {
        	e1.printStackTrace();
        	JOptionPane.showMessageDialog(null, "Der Eintrag konnte nicht gelöscht werden, da er mit einem anderen Datensatz verknüpft ist!", "DB Error", JOptionPane.ERROR_MESSAGE);
		}
        catch (Exception e) {
        	e.printStackTrace();
        }        
       
    }
	
}

Bisher habe ich diese Klasse einmal instanziert und übergebe aus der "MainGui" den Klassen die einen Zugriff auf die DB benötigen dieses Objekt.

Jetzt ist die Frage wie ihr das macht bzw. es gibt doch bestimmt ein Pattern o.ä. welches Zugriffe auf die DB regelt. Wird die DB Klasse in jeder Klasse neu instanziert oder wird die klasse statisch? Oder werden die Klassen mit dem DBConnector erweitert (extends)... (Habe gelesen das DB Zugriffe nicht unbedingt statisch geschehen sollen... )...

Die andere Frage ist, momentan werden alle SQL Abfragen in dem Swing Thread ausgeführt was auch nicht besonders klever ist. Habt ihr eventuell einen Tipp für mich wie ich den DB Zugriff über Threads realisieren kann (Rückgabe, synchron etc..). Ich bin Anfänger und habe doch ein paar Probleme was das Design bzw. die Struktur angeht. Deswegen würde ich mich sehr über ein paar gute Links oder sogar eine bereits von euch eingesetzte Lösung sehr freuen!

Thx Goodcat
 
V

vanny

Gast
Ich würde sagen, dass es durchaus sinnvoll ist mind. einen extra Thread zu benutzen.
Ob dieser permanent laufen sollte oder jeweils neu instanziert wird, hängt mMn. von deinen Programmvorstellungen ab.

Wann du deine Threads syncronisieren musst kann ich dir so leider nicht beantworten, halt immer dann, wenn sie sich in die Quere kommen können :p(Stichwort: "raise conditions" und "lost update").

Wenn´s komplexer wird, kannste auch ein framework benutzen z.Bsp. Hibernate


Gruß Vanny
 

goodcat

Aktives Mitglied
Hi danke für deine Antwort.

Mh also ich glaube ein Framework werde ich nicht brauchen.
Ja meine Programmvorstellungen :bahnhof: ... Ich benötige diesen DBConnector ziemlich oft. Da das Programm nur mit einer MySQL DB zusammen arbeitet. Sprich alle Daten kommen aus der DB.

D.h. was läuft denn dann in dem extra Thread, nur der DBConnector, oder alles was nicht zur Gui gehört?

Danke Goodcat
 
V

vanny

Gast
Das hängt nicht zwingend mit dem Thema DatenBank zusammen sondern eher mit dem richtigen Einsatz des EDT.

Den extra Thread benötigst du immer dann, wenn dein Event(zBsp. Buttonklick) einen längeren Prozess abarbeitet, welcher dann deine GUI blockiert.

Das machst du entweder manuell oder per SwingWorker.

Gruß Vanny
 

goodcat

Aktives Mitglied
Ein Datenbank Zugriff kann ja unter umständen die Gui blockieren... Wenn man das Programm "normal" benutzt ist alles wunderbar nur wenn ich z.B. 20> Datensätze lösche dann wird die Gui ganz kurz blokiert. Das merkt man definitiv nur ist es nicht unbedingt schlimm... Ich denke mal ich muss mir was das Thema Threading in Verbindung mit Swing angeht etwas schlauer machen.

Aber würdest Du denn den DB Zugriff statisch gestalten? Oder ist idas quatsch?


Danke Goodcat
 
V

vanny

Gast
Ich persönlich verwende statische Klassen wirklich nur, wenn es Sinn macht und eine nicht statische Klasse keinen Sinn macht.

In deinem Fall tendiere ich zu "is Quatsch" ;)
 

mimo

Aktives Mitglied
Hallo,

Als Erstes nochmal den Hinweis, dass Variablen in JAVA kleingeschrieben werden. Dann versteh ich nicht, wieso die Variablen als public definiert sind.

Persönlich halte ich auch nichts davon, die Fehlerbehandlung in dieser Klasse zu erledigen. Leite die Fehler bis zur GUI durch und wenn Du nicht vor dem Anwender die Originalmeldung verbergen möchtest, würde ich diese auch anzeigen lassen. Nach dem Geheimnisprinzip hast Du ja keine Ahnung davon, warum ein Fehler geschmissen wird.

Ansonsten solltest Du Dir darüber klar werden, ob Du mehrere parallele Verbindungen aufbauen möchtest. Ich gehe mal davon aus, dass Du nur eine Verbindung öffnen möchtest, da ein Verbindungsaufbau sehr teuer ist und parallele Verbindungen nur selten Sinn machen.
Vor der Ausführung Deiner Query würde ich prüfen, ob die Verbindung offen ist, dann brauchst Du die Verbindung nicht neu zu öffnen. Wenn Du nur eine Verbindung nutzen möchtest, würde ich mit einem Singleton arbeiten, eventuell in einer Klasse Session, die die Referenz auf die aktuelle Verbindung hält und verwaltet.

Gruß

Mimo
 
V

vanny

Gast
Ich denke auch, dass mehrere parallele Verbindungen nicht wünschenswert sind, ob man aber die Verbindung per Singleton aufrecht erhält, oder die Connection jeweils fix initialisiert und dann halt sicherstellt, dass sie wieder geschlossen wird, wenn der Batch abgearbeitet ist, hängt wohl davon ab, ob du dauerhaft Änderungen an der DB vornimmst (Singleton) oder ob du nur ab und an ´nen Button klickst und dann deinen Datenstapel abarbeitest (neue Connection).

Gruß Vanny
 

goodcat

Aktives Mitglied
Sorry das ich erst jetzt antworte!
Erstmals danke.
Auf jeden fall wollte ich mehrere Verbindungen vermeiden. Singleton hört sich ganz gut an, ist auch das einzige Design Pattern das ich bis jetzt einigermaßen durchschaut habe :lol: ... (Singelton in Verbindung mit einem Thread wäre natürlich ideal. Wenn das so möglich ist.)

Vor der Ausführung Deiner Query würde ich prüfen, ob die Verbindung offen ist, dann brauchst Du die Verbindung nicht neu zu öffnen. Wenn Du nur eine Verbindung nutzen möchtest, würde ich mit einem Singleton arbeiten, eventuell in einer Klasse Session, die die Referenz auf die aktuelle Verbindung hält und verwaltet.
Habe eine ganz grobe Idee wie ich das mit Singleton umsetzen könnte, aber keinen Schimmer ob das so funktioniert... Ich werde mal zusehen dass ich heute oder morgen den DBConnector überarbeite und einen Singleton einbinde... Vielleicht könnt ihr euch das dann mal anschauen.

Aber vielen Dank schon mal für eure Hilfe!
 

mimo

Aktives Mitglied
Hier mal eine Möglichkeit mit der ich das gelöst habe.

Anmerkung:
Ich habe die Klasse MySQLConnection zusammen mit dem Treiber in einem Plugin abgelegt, das ich bei Bedarf importieren kann. Äquivalent hierzu besitze ich Plugin / Pakete für Postgre und Oracle.

Wichtig hierbei ist, dass eventuell geworfene Exceptions nicht abgefangen, sondern weitergeworfen werden.

Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * Sollte kein Singelton sein, falls man mehrere Verbindungen zu unterschiedlichen
 * Datenbanken benötigt.
 *
 * Bei mir befindet sich diese Klasse zusammen mit dem MySQL-Treiber in einem Plugin,
 * welches ich mir bei Bedarf importieren kann.
 */
public class MySQLConnection {

	private Connection connection;
	private String benutzername;
	private String passwort;
	private String port = "3306";
	private String server;
	private String datenbank;
	
	public MySQLConnection(){
		
	}
	
	/**
	 * Liefert das Connection-Objekt  der MySql-Verbindung zurück.
	 * @return
	 * @throws SQLException
	 */
	public Connection getConnection() throws SQLException{

		
        if(connection==null || connection.isClosed()){
        	
	        // MySQL Treiber laden
	        DriverManager.registerDriver (new com.mysql.jdbc.Driver());
	        // Verbindung herstellen
	        String str = "jdbc:mysql://" + server + ":" + port + "/" +
	        datenbank;
	        
	        connection = DriverManager.getConnection(str, benutzername, passwort);

        }
        
        return connection;

    }

	/**
	 * @return the benutzername
	 */
	public String getBenutzername() {
		return benutzername;
	}

	/**
	 * @param benutzername the benutzername to set
	 */
	public void setBenutzername(String benutzername) {
		this.benutzername = benutzername;
	}

	/**
	 * @return the passwort
	 */
	public String getPasswort() {
		return passwort;
	}

	/**
	 * @param passwort the passwort to set
	 */
	public void setPasswort(String passwort) {
		this.passwort = passwort;
	}

	/**
	 * Port (Default=3306)
	 * @return the port
	 */
	public String getPort() {
		return port;
	}

	/**
	 * Port (Default=3306)
	 * @param port the port to set
	 */
	public void setPort(String port) {
		this.port = port;
	}

	/**
	 * @return the server
	 */
	public String getServer() {
		return server;
	}

	/**
	 * @param server the server to set
	 */
	public void setServer(String server) {
		this.server = server;
	}

	/**
	 * @return the datenbank
	 */
	public String getDatenbank() {
		return datenbank;
	}

	/**
	 * @param datenbank the datenbank to set
	 */
	public void setDatenbank(String datenbank) {
		this.datenbank = datenbank;
	}
	
}

Java:
/**
 *	Steuert den Programmablauf und hält Referenzen zu den Global benötigten Objekten
 *	
 *
 *
 */
public class Session {
	
	//Hält die Referenz auf das Singelton-Objekt
	private static final Session INSTANCE = new Session();
	
	//LMS-Datenbank
	private String user = "meinName";
	private String passwd = "meinPasswort";
	private String server = "meinServer";
	private String port = "3306"
	private String datenbank = "meineDatenbank";
	private MySQLConnection lmsConnection;

	
	private Session(){
		
	}

        public static Session getInstance(){
            return INSTANCE;
	}

	/**
	 * Liefert eine Connection-Objekt der Datenbank
	 * 		Falls dieses noch nicht existiert, wird es neu angelegt.
	 *		Sollte nicht direkt beim Aufruf des Konstruktors angelegt werden,
	 *		da eventuell noch nicht feststeht ob und wann eine Verbindung benötigt wird
	 *		und ob die Übergabeparameter bereits beim Start feststehen (User/Passwort/usw.)
	 *
	 *		Mit der Methode 'getConnection()' kann auf die aktuelle Verbindung zugegriffen werden.
	 *
	 * @return the Connection
	 */
	public MySQLConnection getConnection() {
		if(connection==null){
			connection = new MySQLConnection();
			connection.setBenutzername(user);
			connection.setPasswort(passwd);
			connection.setPort(port);
			connection.setServer(server);
			connection.setDatenbank(datenbank);
		}
		return connection;
	}


}
 

goodcat

Aktives Mitglied
Wow vielen Dank!
Ach mensch habe mich schon drauf gefreut da heute etwas dran rumzuwerkeln. Naja dann muss ich es nur noch anpassen :D

Jetzt ist nur noch die Frage ob man die Verbindung jetzt noch in einen extra Thread legen sollte.
Ich werde aber erstmal den Code von Dir anpassen.

Vielen Dank!!
Goodcat
 

mimo

Aktives Mitglied
Das kommt darauf an ob Du den User parallel weiterarbeiten lassen möchtest oder nicht. Ich würde einen Fortschrittsbalken modal anzeigen lassen, damit der User sieht, dass das System noch arbeitet, aber selbst nichts mehr machen kann. Dafür benötigst Du natürlich min. zwei parallele Threats.
 

goodcat

Aktives Mitglied
Ok ich habe deinen Code übernommen und eingebunden. Ich muss jetzt natürlich mein halbes Programm umschreiben. Dabei ist mir aufgefallen das ich garnicht genau weiß wie ich auf das Connection Objekt zugreifen kann bzw. sollte.

Hier erstmal Session und MySQLConnection:
Java:
import java.sql.*;
import com.mysql.jdbc.exceptions.jdbc4.CommunicationsException;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
import com.mysql.jdbc.jdbc2.optional.*;

public class MySQLConnection {
		
	private MysqlDataSource ds = new MysqlDataSource();	
	private Connection dbConnection;
	private Statement stm;
	private ResultSet rs;
	private ConfigFile iniFile;
	
	
	public MySQLConnection() {
		this.iniFile = new ConfigFile();
	}
	
	
	public void openConnection() {
		try {
			ds.setDatabaseName(iniFile.getDbname());
			ds.setServerName(iniFile.getServername());
			ds.setPort(Integer.parseInt(iniFile.getServerport()));
			ds.setUser(iniFile.getUsername());
			ds.setPassword(iniFile.getPassword());
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public Connection getConnection() {
		try {
			if( dbConnection==null || dbConnection.isClosed() ){
				openConnection();
			}
		} 
		catch (SQLException e) {
			e.printStackTrace();
		}
        
        return dbConnection;
	}
	
	public void closeConnection() {	
		
		try {
			dbConnection.close();
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	public ResultSet executeQuery( String query ) {
    	try {
    		dbConnection = ds.getConnection();
    		stm = dbConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
        	rs = stm.executeQuery(query);
    	}
    	catch (CommunicationsException e) {
    		e.printStackTrace();
    		return null;
    	}
    	catch (Exception e) {
			e.printStackTrace();
			return null;
		}
    	
    	return this.rs;
	}
	
	public boolean alterQuery( String query ) {
	     
        try {
        	dbConnection = ds.getConnection();
        	stm = dbConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
        	stm.executeUpdate(query);
        }
        catch(MySQLIntegrityConstraintViolationException e) {
        	e.printStackTrace();
        	return false;
		}
        catch (Exception e) {
        	e.printStackTrace();
        	return false;
        }
        
		return true;        
       
    }
	
}

Java:
public class Session {

    private static final Session INSTANCE = new Session();    
    private MySQLConnection dbConnection;
 
    
    private Session(){
    }
    
 
    public static Session getInstance(){
        return INSTANCE;
    }


    public MySQLConnection getConnection() {
        if( dbConnection==null ){
        	dbConnection = new MySQLConnection();
        }
        return dbConnection;
    }
 
 
}

Jetzt habe ich eine Klasse die auf die DB Zugreifen muss. Diese Klasse wird instanziert wenn z.B. ein Kunde in die DB hinzugefügt werden soll.
Kann ich jetzt das Connection Objekt im Konstruktor (der Klasse Kunde) als Eigenschaft zuweisen oder sollte ich es immer nur tun wenn ich es wirklich benötige, also z.B. in der Methode.

Und wie greife ich am besten auf das Objekt zu. Habe folgendes probiert:
Code:
ResultSet rs = Session.getInstance().getConnection().executeQuery( "SELECT name FROM tbl_kunden ORDER BY name ASC;" );

Ist das so gedacht bzw. sinnvoll?


Danke Goodcat
 
Zuletzt bearbeitet:

mimo

Aktives Mitglied
Versuchs mal so:

Java:
Connection conn = Session.getInstance().getConnection().getConnection();

Ich habe die Methode in Session nicht clever benannt ;)

Die enthielt vorher den Namen der Datenbank bzw. des Programms welches die Datenbank original benutzte.

Gruß

MIMO
 

mimo

Aktives Mitglied
Ohh sorry, habe nicht gesehen, dass Du die Klasse umgewandelt hasst.

In dem Fall musst Du bei executeQuery dir die Connection über this.getConnection() besorgen. Sonst umgest Du ja die Kontrolle der getter-Methode.

Ich würde die Datenbankabfragen auch in spezielle DAO-Klassen auslagern.
 

goodcat

Aktives Mitglied
Ok werde ich nacher ausprobieren. Danke.

Oh ja stimmt ist mir garnicht aufgefallen... Ich sollte natürlich die getConnection() Methode aus der MySQL Klasse benutzen und nicht this.dbConnection... Könnte ja null oder geschlossen sein.!

Zum 2. Post, DAO klasse = Data Access Object soviel weiss ich darüber :lol:
Ich nehme mal an das wird eine Klasse sein die SQL Statements entgegen nimmt bzw. sich um die Zugriffe kümmert...

Also eine Klasse die z.B. nur die beiden Methoden (exceuteQuery und alterQuery) beinhaltet?
Hast Du eventuell gute Links wo die DAO Klassen erklärt werden bzw. ich werde mal nach Googlen?

Thx
Goodcat
 

goodcat

Aktives Mitglied
Also diese DAO Geschichte muss ich mir nochmal genauer anschauen.
Der DB Zugriff funktioniert soweit einwandfrei.

Jetzt nur noch eine Frage und zwar wie ich die Abfrage in einem extra Thread ausführen kann?
Ist die Frage was sinniger ist. Ob ich executeQuery() und alterQuery() in eine extra Klasse packe und die Threade oder die ganze MySQLConnection Klasse Threade? Vermutlich ist es nicht so sinnvoll die ganze MySQLConnection klasse zu Threaden?!


Java:
public class Session {

	private static final Session INSTANCE = new Session();
	private MySQLConnection dbConnection;

	private Session() {
	}

	public static Session getInstance() {
		return INSTANCE;
	}

	public MySQLConnection getMySQLClass() {
		if (dbConnection == null) {
			dbConnection = new MySQLConnection();
		}
		return dbConnection;
	}

}

Java:
public class MySQLConnection {

	private MysqlDataSource ds = new MysqlDataSource();
	private Connection dbConnection;
	private Statement stm;
	private ResultSet rs;
	private ConfigFile iniFile;

	public MySQLConnection() {
		this.iniFile = new ConfigFile();
		
	}

	/**
	 * Prüft ob eine Verbindung besteht oder ob Sie geschlossen wurde und
	 * liefert eine Connection zurück.
	 * 
	 * @return Connection
	 */
	public Connection getConnection() {
		try {
			if (this.dbConnection == null || this.dbConnection.isClosed()) {
				try {
					ds.setDatabaseName(iniFile.getDbname());
					ds.setServerName(iniFile.getServername());
					ds.setPort(Integer.parseInt(iniFile.getServerport()));
					ds.setUser(iniFile.getUsername());
					ds.setPassword(iniFile.getPassword());
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return this.dbConnection;
	}

	/**
	 * Schließt die Verbindung zum Datenbank Server.
	 */
	public void closeConnection() {

		try {
			dbConnection.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * Methode zum einfügen von Datensätzen.<br>
	 * Erwartet einen String mit der SQL Query die ausgeführt werden soll.
	 * 
	 * @param query
	 *            String
	 * @return ResultSet
	 */
	public ResultSet executeQuery(String query) {
		try {
			getConnection();
			this.dbConnection = ds.getConnection();
			this.stm = dbConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
			this.rs = stm.executeQuery(query);
		} catch (CommunicationsException e) {
			e.printStackTrace();
			return null;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

		return this.rs;
	}

	/**
	 * Methode zum löschen von Datensätzen<br>
	 * Erwartet einen String mit der SQL Query die ausgeführt werden soll.
	 * 
	 * @param query
	 *            String
	 */
	public boolean alterQuery(String query) {

		try {
			getConnection();
			this.dbConnection = ds.getConnection();
			this.stm = dbConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
			this.stm.executeUpdate(query);
		} catch (MySQLIntegrityConstraintViolationException e) {
			e.printStackTrace();
			return false;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

		return true;

	}

}

Und so benutze ich dann das Singleton.
Ich greife nicht auf die Connection direkt zu sondern auf das MySQLConnection Objekt und hole mir dann das ResultSet:
Java:
public DefaultComboBoxModel<String> getCustomerDfcbm() {
		
		MySQLConnection dbObj  = Session.getInstance().getMySQLClass();
		
		try {			
			ResultSet rs = dbObj.executeQuery( "SELECT name FROM tbl_customers ORDER BY name ASC;" );
			this.customer = new DefaultComboBoxModel<String>();
				
			this.customer.addElement("");
			
			while (rs.next()) {
				this.customer.addElement(rs.getString(1));
			}
			rs.close();
		}		
		catch (Exception e) {
			e.printStackTrace();
		}
		
		dbObj.closeConnection();
		
		return this.customer;
		
	}
 
Zuletzt bearbeitet:

mimo

Aktives Mitglied
Du solltest Dir die Frage stellen, wieviel Zeit die Abfragen durchschnittlich in anspruchnehmen. Hier bei der Initalisierung Deines GUIs liegt die Zeit wahrscheinlich unter 2 Sekunden. Da würde ich keinen extra Thread für einrichten. Alle Abfragen die länger Dauern sollte man durch einen Indikator dem User kenntlich machen. Zum Beispiel durch Änderung des Mousepointersymbols oder durch Anzeige einer Progressbar(Progressdialog). Zum Ändern des Mousepointers benötigst Du auch nicht unbedingt einen neuen Thread und ist sicher sinnvoll. Falls ein neuer Thread erforderlich sein sollte, packe die Initialisierung aller Felder in eine Methode, die Du in einem Runnable kapselst, welches Du anschließend in einem separaten Thread starten kannst.
 

goodcat

Aktives Mitglied
Tjo also das starten der MainGui geht ruck zuck. Einzelne DB abfragen sind kein Thema.
Ein bisschen nervig wird es wenn ich 30 Einträge nacheinander öffne (eigentlich absolut ok).
Ich habe mal zum Spaß einen SwingWorker die DB Abfragen und den Aufbau der Gui zum bearbeiten des Datensatzes machen lassen.
Interessanterweise dauert es mit dem SwingWorker 3x länger! Aber ich vermute das liegt daran das er jeden Eintrag nacheinander abarbeitet. Nach jedem Eintrag wird die Gui zum bearbeiten geöffnet dann wird zum nächsten Eintrag (DB Zeile) gesprungen usw. Ich vermute das das aufbauen der Gui die verzögerung verursacht...

Dein Tipp wäre ne Möglichkeit nur das problem wird dasselbe sein.
- Ich wähle 40 Datensätze aus und sage bearbeiten
- for Scheife läuft durch und öffnet jede Zeile nacheinander und baut die Gui auf (neues JInternalFrame wird geöffnet)

Wenn ich jetzt ein WarteDialog einblende wird der auch hänger haben. Da durch das öffnen der Eintrage der EDT kurzzeitig ausgelastet ist. So meine vermutung... Thread hin oder her. Da ja alle Swing Operationen im EDT abgearbeitet werden, wenn ich mich nicht irre.

Aber wann öffnet man schonmal 40 Fenster... mal davon abgesehen wenn ich 40 Fenster (MDI) aufhabe die Oberfläche sowieso "langsamer" ist (fühlt sich "schmierig" an wenn Fenster verschoben werden...).

Also ich denke mal das Threads absolut unnötig sind... eventuell könnte man noch Performance gewinnen wenn ich die DB Querys sammle und aufeinmal abschicke (Transaktionen) ..


Hat sich erstmal alles erledigt, muss als nächstes sowieso die Struktur von dem Prog. komplett überarbeiten... Die OOP bereitet mir echt Kopfschmerzen, bin da noch nicht ganz durchgestiegen :rtfm:
Vielen Dank für deine Hilfe, das mit dem Singleton funzt 1A!!
Goodcat
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
M Datenbank vor unerlaubtem Zugriff durch Benutzer schützen Datenbankprogrammierung 3
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S HSQLDB Zugriff auf Access Datenbank Datenbankprogrammierung 0
K MySQL Datenbank 2facher Zugriff Datenbankprogrammierung 1
P Datenbank Zugriff fehlgeschlagen Datenbankprogrammierung 9
B MySQL JDBC Zugriff auf entfernt Datenbank, fehlende Rechte Datenbankprogrammierung 2
L Zugriff auf lokal gespeicherte mySQL Datenbank Datenbankprogrammierung 3
D .mdb Datenbank Zugriff fehlgeschlagen Datenbankprogrammierung 5
E Zugriff auf MySQL-Datenbank Datenbankprogrammierung 4
I Zugriff auf Datenbank nach Erstellen einer Executable Jar Datei verweigert Datenbankprogrammierung 10
I Zugriff auf eine Datenbank auf dem Webserver Datenbankprogrammierung 2
E H2 - Globalen Zugriff auf die Datenbank? Datenbankprogrammierung 10
J Zugriff auf MySQL-Datenbank Datenbankprogrammierung 5
F Zugriff auf MS Access-Datenbank mit jackcess Datenbankprogrammierung 10
T Problem bei Zugriff auf Access Datenbank Datenbankprogrammierung 7
T MySQL Zugriff ohne Angabe der Datenbank Datenbankprogrammierung 3
M Zugriff auf eine Access-Datenbank innerhalb eines jar-Files Datenbankprogrammierung 7
J Nullpointer Exception bei Zugriff auf Datenbank Datenbankprogrammierung 13
J Zugriff auf Access-Datenbank Datenbankprogrammierung 3
T Zugriff auf Derby-Datenbank will einfach nicht klappen Datenbankprogrammierung 22
G Zugriff auf Datenbank im Internet Datenbankprogrammierung 6
G treiber für datenbank zugriff Datenbankprogrammierung 3
L Datenbank URL Zugriff Datenbankprogrammierung 9
S Datenbank zugriff optimieren - zugriff ohne cursor? Datenbankprogrammierung 7
E JDBC Oracle Fehler, zugriff auf datenbank (Cluster) Datenbankprogrammierung 5
D ODBC Zugriff auf MDB-Datenbank, Insert Into ohne Funktion Datenbankprogrammierung 2
D Kann nicht auf MySQL Datenbank Zugriff Datenbankprogrammierung 9
D Datenbank zugriff über Client/Server Datenbankprogrammierung 4
F Zugriff auf ODBC-Datenbank übers Netzwerk Datenbankprogrammierung 6
D Zugriff auf Paradox-Datenbank Datenbankprogrammierung 10
D HSQLDB Datenbank Zugriff! Datenbankprogrammierung 4
R Zugriff auf MySQL-Datenbank im Internet Datenbankprogrammierung 13
K Zugriff auf Access-Datenbank Datenbankprogrammierung 4
R Datenbank zugriff funktioniert nur offline Datenbankprogrammierung 2
H MariaDB-Zugriff mittels Java SE Datenbankprogrammierung 3
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
L Zugriff auf ein Resultset Datenbankprogrammierung 7
R jdbc-Zugriff Nicht erlaubt ? Datenbankprogrammierung 16
D Gleichzeitiger Zugriff auf der DB Datenbankprogrammierung 11
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
D JavaFX Anwendung zugriff auf MySQL DB. Datenbankprogrammierung 2
F Zugriff auf ein bestimmte Row Datenbankprogrammierung 13
M DB-Zugriff funktioniert nach JAR-Erstellung nicht mehr Datenbankprogrammierung 3
L MySQL App/Java Zugriff auf Mysql-DB funktioniert nicht Datenbankprogrammierung 1
W MySQL -Server Einstellung -- Zugriff übers lokale Netzwerk Datenbankprogrammierung 1
R Oracle jdbc Zugriff auf Oracle Datenbankprogrammierung 2
T Derby/JavaDB Zugriff auf DB mit exportiertem Programm Datenbankprogrammierung 12
A MySQL-Zugriff auf Raspberry Pi Datenbankprogrammierung 2
T PostgreSQL Best Practice: Konkurrierender DB-Zugriff mit meherern Programmen? Datenbankprogrammierung 20
B Datenbanken schützen vor Zugriff Datenbankprogrammierung 3
K MySQL Zugriff auf Remote-DB verweigert Datenbankprogrammierung 6
C Hibernate n:m mittels Zwischentabelle und bidirektionaler Zugriff Datenbankprogrammierung 2
M Zugriff auf mdb via ODBC steuern Datenbankprogrammierung 2
A Zugriff auf DB-Tabellen mit Objekten Datenbankprogrammierung 3
D Was passiert bei absolut zeitgleichem Zugriff auf eine Tablerow Datenbankprogrammierung 7
J Derby/JavaDB Zugriff ohne Entwicklungsumgebung Datenbankprogrammierung 5
F suche Erstanschub für DB-Zugriff Datenbankprogrammierung 9
E einfache Frage bei DB-Zugriff Datenbankprogrammierung 11
P MySQL Remote Zugriff Datenbankprogrammierung 2
C Gleichzeitiger Zugriff auf Datensatz Datenbankprogrammierung 5
N Wie kann ich Zugriff auf eine MS Access DB (mit JDBC) über Netzwerk erreichen? Datenbankprogrammierung 7
J Frage zu Synchronisation bei parallelem Zugriff, speziell mit JPA Datenbankprogrammierung 2
T DB Zugriff mit Java Web Datenbankprogrammierung 6
R Zugriff auf SQL im PreparedStatement Datenbankprogrammierung 4
F Zugriff auf MS Access DB Datenbankprogrammierung 3
A Zugriff auf Remote MySQL-DB mit JAR-File Datenbankprogrammierung 7
R Java DB Zugriff Datenbankprogrammierung 2
J Java DB Zugriff auf Access (Migration auf andere DB) Datenbankprogrammierung 8
G Wie baut man eine Anwendung mit DB Zugriff Datenbankprogrammierung 3
QDog JPA persistence.xml auslagern/extern Zugriff Datenbankprogrammierung 2
A HSQLDB Performance bei erstem Zugriff Datenbankprogrammierung 6
A Zugriff auf DB-Pool, der von Servlet initialisiert wurde Datenbankprogrammierung 4
J MYSQL-Zugriff mittels einer Java-Bean Datenbankprogrammierung 42
M mySQL zugriff funktionert nach ca4 stündiger laufzeit nicht Datenbankprogrammierung 6
J Zugriff mit DataSource Datenbankprogrammierung 7
M Zugriff für andere sperren Datenbankprogrammierung 11
K Zugriff mittels JDBC funktioniert nur lokal Datenbankprogrammierung 5
S Zugriff auf eine große Datenmenge von MS Access per JDBC Datenbankprogrammierung 11
G Hibernate Zugriff Datenbankprogrammierung 5
T Zugriff auf MS-Access-DB ist grottenlangsam. Normal? Datenbankprogrammierung 9
G Verwendung neuen Treiber für JDBC-Zugriff auf OracleDB Datenbankprogrammierung 5
G Access Zugriff, DB auf Server, Applet Datenbankprogrammierung 4
D Problem beim Zugriff auf eine Oracle-DB Datenbankprogrammierung 23
G Policy Eintrag für SQL Zugriff im Netzwerk Datenbankprogrammierung 10
S Java SQL-Exception bei Zugriff auf MSAccess Datenbankprogrammierung 2
S JDBC Zugriff auf SQLServer Datenbankprogrammierung 9
M Zugriff auf PostgreSQL mit JAva! Datenbankprogrammierung 7
G Problem beim Zugriff SQL 2000 Datenbankprogrammierung 2
T Verwaltungsystem mit grafischer Oberfläche mit Zugriff auf. Datenbankprogrammierung 6
C Zugriff auf MS Access Datenbankprogrammierung 4
B ResultSet aus Session geladen, aber kein Zugriff möglich Datenbankprogrammierung 6
L Programm-Architektur bei DB-Zugriff Datenbankprogrammierung 6
L Zugriff von Applet auf mysql-DB Datenbankprogrammierung 2
G Fehlermeldung beim Zugriff auf SQL-Server-DB Datenbankprogrammierung 3
D Mysql zugriff aus java nicht moeglich Datenbankprogrammierung 2
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben