Zugriff auf ein Objekt mit mehreren Threads

Status
Nicht offen für weitere Antworten.

localhorst

Mitglied
Hallo,

habe mal wieder ein neues Problem.

Ich möchte mit einer grafischen Oberfläche Informationen eines Objekts darstellen.
Dieses Objekt braucht aber sehr viele Daten, die gleichzeitig mit mehreren Threads aus der Datenbank geholt werden müssen.

Das Zugreifen auf 1 Objekt mit mehreren Threads habe ich in einer Beispielapplikation (siehe unten) schon hinbekommen.. doch sobald die Datenbank ins Spiel kommt, geht es nicht.
es kommen sehr merkwürdige Sql Fehler wie z.B
Code:
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
Der Sql Code ist aber ok.
hat jemand eine Idee warum es mit der Methode wie unten im Beispiel nicht funktioniert?
hat jemand eine andere Lösung um gleichzeitig Datenbankquerys durchzuführen?
Habe es auch schon mit Observerable und Observer versucht, doch da wird erst gar nicht auf das Notify reagiert.


Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package threads;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    final Test test = new Test();

    public Main(){
        init();
    }

    private void init(){
      // Reihenfolge 4,3,2,1


      final Lock lock = new ReentrantLock();
      final Condition test2Set = lock.newCondition();
      final Condition test3Set = lock.newCondition();


        Runnable r1 = new Runnable() {

            public void run() {
                lock.lock();
                try{
                    test2Set.await();
                    test.setTest1();
                }
                catch(Exception e){
                    e.printStackTrace();
                }
                finally{
                    lock.unlock();
                }

            }
        };

        Runnable r2 = new Runnable() {

            public void run() {
                lock.lock();
                try{
                    test3Set.await();
                    test.setTest2();
                    test2Set.signal();
                }
                catch(Exception e){
                    e.printStackTrace();
                }
                finally{
                    lock.unlock();
                }

            }
        };

        Runnable r3 = new Runnable() {

            public void run() {
                lock.lock();
                try{
                    test.setTest4();
                    test.setTest3();
                    test3Set.signal();
                }
                catch(Exception e){
                    e.printStackTrace();
                }
                finally{
                    lock.unlock();
                }

            }
        };

        new Thread(r2).start();
        new Thread(r1).start();
        new Thread(r3).start();

    }



    public static void main(String[] args) {
        new Main();
        // TODO code application logic here

    }
    
    private class Test extends Object{
        private String test1;
        private String test2;
        private String test3;
        private String test4;
        
        public Test(){
            super();
        }
        
        void setTest1(){
            try {

                //Thread.sleep(42);
                this.test1 = "Test1";
                System.out.println("Thread : " + Thread.currentThread().getName() + " : " + test1);

            } catch (Exception ex) {
                ex.printStackTrace();
            }

        }

        void setTest2(){
            try {
                //Thread.sleep(2000);
                this.test2 = "Test2";
                System.out.println("Thread : " + Thread.currentThread().getName() + " : " + test2);
            } catch (Exception ex) {
                 ex.printStackTrace();
            }

        }

        void setTest3(){
            try {

                //Thread.sleep(1);
                this.test3 = "Test3";
                System.out.println("Thread : " + Thread.currentThread().getName() + " : " + test3);
                
            } catch (Exception ex) {
                 ex.printStackTrace();
            }

        }

        void setTest4(){
            try {

                //Thread.sleep(40);
                this.test4 = "Test4";
                System.out.println("Thread : " + Thread.currentThread().getName() + " : " + test4);

            } catch (Exception ex) {
                 ex.printStackTrace();
            }

        }


    }
}
 

localhorst

Mitglied
das kommt ja nur aus dem SQL Package... Der komplette Stacktrace wäre interessant! Und vor allem wo in deinem Code oben was mit SQL vorkommt oder hab ich was überlesen?

Der Code oben ist generell nur ein Beispiel wie ich mit lock und notify, await die Threads steuere, und auf 1 object zugreife.
Stellt euch einfach vor, die Testmethoden sind Datenbankabfragen.

Ich kann leider kein anderes Beispiel posten, das wäre glaube ich viel zu unübersichtlich
 

manuche

Bekanntes Mitglied
Naja ne SQL-Exception kommt ja nicht von ungefähr... Wird schon seinen Grund haben warum die geschmissen wird! Poste mal am besten den ganzen Stacktrace der Exception!
 

localhorst

Mitglied
Naja ne SQL-Exception kommt ja nicht von ungefähr... Wird schon seinen Grund haben warum die geschmissen wird! Poste mal am besten den ganzen Stacktrace der Exception!

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2593)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2734)
at mysamples.objectclasses.Boxen.setAllProben(Boxen.java:640)
at mysamples.programgui.BoxWindow$3.run(BoxWindow.java:192)
at java.lang.Thread.run(Thread.java:636)


hier, dazu muss ich sagen, dass die Exception nicht auftritt, wenn ich alle Abfragen nacheinander ohne Threads ausführe.
 

manuche

Bekanntes Mitglied
Ich könnte drauf wetten, dass es was mit dem abfeuern der Datenbankabfragen zu tun hat! Das ganze muss natürlich mindestens Threadsafe programmiert sein...
Am besten hast du natürlich eine zentrale Klasse die die Verbindung zur DB verwaltet und nach einander Statements abfeuert! Kommt jetzt halt drauf an wie du es umgesetze hast!
 

localhorst

Mitglied
Ich könnte drauf wetten, dass es was mit dem abfeuern der Datenbankabfragen zu tun hat! Das ganze muss natürlich mindestens Threadsafe programmiert sein...
Am besten hast du natürlich eine zentrale Klasse die die Verbindung zur DB verwaltet und nach einander Statements abfeuert! Kommt jetzt halt drauf an wie du es umgesetze hast!

Sowas vermute ich auch, wie könnte ich die Datenbank klasse Threadsafe umprogrammieren? habe sogut wie noch nie mit zusätzlichen Threads gearbeitet.
 

manuche

Bekanntes Mitglied
Java:
public class ModelConnection {
	private Connection con;
	
	public boolean createConnection(){
		try{
			Class.forName ("com.mysql.jdbc.Driver");
			String strCon = "jdbc:mysql://localhost:3306/blablubb";
			this.con = DriverManager.getConnection (strCon, "root", "");			
		}catch (ClassNotFoundException e){
			e.printStackTrace ();
			return false;
		}catch (CommunicationsException e) {
			e.printStackTrace();
			return false;
		}catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	public boolean hasConnection(){
		if (this.con != null){
			try {
				if (!this.con.isClosed()){
					return true;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return false;
	}
	
	public boolean closeConnection(){
		if (this.con != null){
			try {
				if (!this.con.isClosed()){
					this.con.close();
					return true;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return false;
	}

	public synchronized ResultSet fetch (String query) throws SQLException {
		Statement stmt = this.con.createStatement();
		return stmt.executeQuery(query);
	}
}
ich würd es so oder so ähnlich probieren... Mit synchronized wird verhindert, dass meherere Threads gleichzeitig die Methode benutzen und das Abfeuern des Statements ist halt eine geschlossene Sache!
 

localhorst

Mitglied
ich würd es so oder so ähnlich probieren... Mit synchronized wird verhindert, dass meherere Threads gleichzeitig die Methode benutzen und das Abfeuern des Statements ist halt eine geschlossene Sache!

Dankesehr, habe meine Datenbankklasse soweit umgebaut, leider kommt immernoch der gleiche Fehler, liegt es vielleicht doch an der Art, wie ich in den Runnables locke?
 

localhorst

Mitglied
Das Problem ist jetzt wie es scheint behoben, lag daran, dass ich 2 x await in einen Runnable hintereinander drin hatte und ich nicht wusste, dass es dann nicht mehr geht.
Warum es nicht geht, weiss ich jetzt immernoch nicht.

Naja und dann hatte ein noch einen ganz ärgerlichen Fehler, wusste nicht, dass man zuerst getResult.next() aufrufen muss, damit man überhaupt einen Datensatz bekommt, der Teil war in einer If Schleife for dem while(db.getResult().next()), wenn ich es ohne Threads ausgeführt habe, ist er nie rein gesprungen in die Schleife, da gewisse Daten schon vorhanden waren.
Trozdem war das mit der Synchronized Methode in der Db Klasse hilfreich.

Danke für die Hilfe.
 

manuche

Bekanntes Mitglied
Die Datenbankklasse ist natürlich nur auf das nötigste reduziert und sehr sparsam!
Hat sich allerdings für mich in der Berufsschule bewährt... Copy-Paste und man hat das nötigste! :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B synchronisierter zugriff auf Objekt Allgemeine Java-Themen 6
L Zugriff auf Objekt das sich in einer Liste befindet Allgemeine Java-Themen 2
mhauert NullPointerException bei Zugriff auf JNI Objekt Allgemeine Java-Themen 6
V Zugriff auf "verwaistes" Objekt? Allgemeine Java-Themen 6
M Zugriff auf Objekt, Name in Variable Allgemeine Java-Themen 3
J 2 Threads: Gleichzeitiger Zugriff auf ein Objekt Allgemeine Java-Themen 2
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Java Zugriff auf Netzwerklaufwerk Allgemeine Java-Themen 1
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
O Zugriff auf mySQL ohne JDBC Allgemeine Java-Themen 3
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
W Zugriff auf Objektvariablen vs. Übergabe Allgemeine Java-Themen 3
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
Tommy Nightmare HTTP Zugriff auf Internetseite im Loginbereich Allgemeine Java-Themen 5
H Zugriff auf PHP Allgemeine Java-Themen 4
B DB-Zugriff einer Webanwendung funktioniert nicht mit Java 7 Allgemeine Java-Themen 2
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
O JNA Zugriff auf Funktion aus DLL Allgemeine Java-Themen 0
O Zugriff auf Windows Zertifikatstore Allgemeine Java-Themen 2
M Kein Zugriff auf microSD Karten Allgemeine Java-Themen 4
T Zugriff auf Datenbank Allgemeine Java-Themen 1
J Zugriff auf IMAP GMail Konto scheitert. Allgemeine Java-Themen 2
P Frontend- Zugriff auf WS- Backend Allgemeine Java-Themen 0
U Zugriff auf Datei sperren Allgemeine Java-Themen 5
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
C Zugriff auf Event felder Allgemeine Java-Themen 0
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
F Zugriff Verweigert bei Kopieroperation? Allgemeine Java-Themen 4
T JNI: kein Zugriff auf VM in Callback-Methode eines Windows-Hooks Allgemeine Java-Themen 3
S Dynamischer Zugriff Allgemeine Java-Themen 4
Minonos Einem Programm Zugriff auf bestimmte Ordner geben Allgemeine Java-Themen 5
E Zugriff auf Dateien im Filesystem überwachen Allgemeine Java-Themen 5
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
V Zugriff auf den Objekterzeuger? Allgemeine Java-Themen 4
M Zugriff zweier Threads auf diesselbe Methode Allgemeine Java-Themen 16
B Zugriff auf eine HashMap Allgemeine Java-Themen 4
B JApplet Zugriff auf Local Storage des Browser? Allgemeine Java-Themen 2
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
M gleichzeitiger Zugriff auf eine Textdatei Allgemeine Java-Themen 6
D Eclipse Kein Zugriff auf Inhalt einer referenzierten .jar Allgemeine Java-Themen 5
nutellastulle Zugriff, Übergabe, Bearbeitung und Ausgabe von Jlist Allgemeine Java-Themen 6
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
J XML Element Zugriff Allgemeine Java-Themen 4
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
M Klassen Zugriff auf getMethode ohne Klasse zu erzeugen Allgemeine Java-Themen 6
A Input/Output Applet-Zugriff auf PHP-Schnittstelle (externer Server) Allgemeine Java-Themen 22
H Vererbung Abgeleitete Klassen und Zugriff Allgemeine Java-Themen 2
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
J Zugriff auf Poker-Client Fenster Allgemeine Java-Themen 14
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
S Zugriff auf innere Klasse Allgemeine Java-Themen 3
D Kein Zugriff auf WebService ausser localhost Allgemeine Java-Themen 4
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
J Zugriff auf Dateien auf einem shared Folder? Allgemeine Java-Themen 3
H Zugriff auf VBA in Java Allgemeine Java-Themen 2
Haave Audio Device Unavailable: Kein gleichzeitiger Zugriff auf Soundsystem möglich Allgemeine Java-Themen 7
G Letzter Zugriff auf Datei Allgemeine Java-Themen 5
C java.io.FileNotFoundException: (Zugriff verweigert) Allgemeine Java-Themen 14
O Zugriff auf Serielle Schnittstelle - Keine Ports gefunden. Allgemeine Java-Themen 8
C Webstart: Zugriff auf lokale Dateien? Allgemeine Java-Themen 2
X Zugriff auf ComboBoxen in Hauptklasse von zweiter Klasse aus Allgemeine Java-Themen 8
J Zugriff auf gemeinsame Funktionen Allgemeine Java-Themen 4
Airwolf89 Zugriff auf ArrayList<ArrayList> Allgemeine Java-Themen 3
Airwolf89 Zugriff auf Werte in ArrayList<ArrayList> Allgemeine Java-Themen 4
T Zugriff zwischen Klassen für repaint Allgemeine Java-Themen 7
N Zugriff auf eine Referenzvar. Allgemeine Java-Themen 3
S Zugriff auf Klasse Allgemeine Java-Themen 4
Meldanor Mehrdimensionale Arrays : Zugriff auf n-tes Array Allgemeine Java-Themen 5
E JNA:Zugriff auf Common-Block von Fortran bzw. Struct in C Allgemeine Java-Themen 2
T Zugriff auf Singleton verkürzen - Namespaces?? Allgemeine Java-Themen 20
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
S Zugriff auf einzelne Bildpunkte Allgemeine Java-Themen 3
D Referenzen weiterreichen vs. statischer Zugriff Allgemeine Java-Themen 3
V Zugriff auf Default-Package? Allgemeine Java-Themen 6
P RegeEx-Problem: Zugriff auf group Allgemeine Java-Themen 2
M Zugriff auf Parallel-Schnittstelle Allgemeine Java-Themen 2
B Zugriff mit einem Applet auf den Datenträger Allgemeine Java-Themen 11
S Innere Klasse: Zugriff auf äußere Variable Allgemeine Java-Themen 5
I Zugriff auf Daten Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
D Zugriff auf Windows Dienste Allgemeine Java-Themen 7
G Zugriff auf Memberclasses einer geladenen Class-Datei Allgemeine Java-Themen 2
I Gleichzeitiger zugriff auf ein Long über Threads Allgemeine Java-Themen 2
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
J Kein Zugriff auf Klassen im Default Package Allgemeine Java-Themen 8
M Paralleler Zugriff auf statische Methode Allgemeine Java-Themen 5
S Zugriff auf unterschiedliche JREs Allgemeine Java-Themen 7
M "Unzulässiger Zugriff auf einen Speicherbereich" Allgemeine Java-Themen 7
A Zugriff auf Parallelport nur über Eclipse nicht über .jar ! Allgemeine Java-Themen 12
G Zugriff auf ein sama share Allgemeine Java-Themen 8
J Java zugriff auf Exchange Server Allgemeine Java-Themen 10
D eclipse: Zugriff auf Ordner per code Allgemeine Java-Themen 4
O Konkurrierender Zugriff auf Log-Datei mit Log4J Allgemeine Java-Themen 11
Caracasa [Threads] Gleichzeitiger Zugriff auf eine LinkedList Allgemeine Java-Themen 9
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben