tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
589
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    kahuna kahuna ist offline Mitglied Gold
    Registriert seit
    Jul 2003
    Beiträge
    154
    Hallo,

    Hach das Leben ist nicht einfach =D...

    Ich schreibe gerade eine Applikation, in der intensiv Multithreading verwendet wird. Zuerst eine Verständnisfrage. Nehmen wir folgende Situation an:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    private static readonly object padlock = new object();
    private void ThreadSafeMethode()
    {
        lock(padlock)
        {
              for(...)
              {
                 this.SomeMethod();
              }
        }
    }
    private void SomeMethod()
    {
        //some actions
    }

    Die obere Methode wird nun synchronisiert ausgeführt. Meine Frage ist nun, ob ich das richtig verstehe, dass die untere Methode unter Umständen nicht threadsicher ist.

    Meine zweite Frage hat etwas mit der oberen zu tun.
    Ich arbeite mit den System.Data.SqlClient um in Threads Daten abzufragen. Von Zeit zu Zeit kriege ich die Exception, dass mehrere Datareads gleichzeitig auf einer Verbindung ausgeführt wurden (was ja nicht verwunderlich ist, da die Threads sich überschneiden können). Wie kann ich dies verhindern. Doch nicht jedem Thread eine eigene Connection geben oder?

    Gruss Alexander
     

  2. #2
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Hallo kahuna!
    Meine Frage ist nun, ob ich das richtig verstehe, dass die untere Methode unter Umständen nicht threadsicher ist.
    Ganz gewiss.
    Es können DeathLocks oder halt skurile Exceptions entstehen,
    wenn versucht wird von mehreren Threads aus gleichzeitig auf ein Objekt zuzugreifen.

    Du kannst dein DB Objekt via Singleton überall verfügbar machen und den Zugriff darauf Synchronisieren.
    Das lock Statement repräsentiert die Methoden
    Monitor.Enter( obj ) und Monitor.Exit( obj ). Innerhalb dieses Blocks wird sichergestellt,
    dass immer nur ein Prozess zugriff auf die Objekte innerhalb der Methode hat.
    Singelton - Post


    MfG,
    cosmo
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  3. #3
    kahuna kahuna ist offline Mitglied Gold
    Registriert seit
    Jul 2003
    Beiträge
    154
    Wenn ich nun aber bewusst will, dass mehrere Threads gleichzeitig die Datenbank abfragen können, wie bewerkstellige ich dies?

    Gruss Alexander
     

  4. #4
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    So was hab ich noch nicht gemacht. Vielleicht ist es mit merheren Connections möglich.
    Aber das sollte lieber jemand beantworten der mit mehrerern gleichzeitigen DBZugriffen Erfahrung hat.
    Es können da aber wahrscheinlich Inkonsistenzen enstehen, wenn Du Werte reinschreibst,
    die wiederum von einem deiner anderen Thread benötigt werden.

    Aber wie gesagt ich hab mich bisher immer nur auf eine Connection zu einer DB beschränkt.
    Was musst den für riesige Datenmengen umsetzen, wenn man mal fragen darf?
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  5. #5
    Freak2k Freak2k ist offline Mitglied Gold
    Registriert seit
    Apr 2005
    Beiträge
    129
    wenn du den thread in eine eigene klasse packst:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    class Worker
    {
       private MySqlConnection con = null;
     
       public Worker()
       {
          con = new MySqlConnection(connectionString);
          con.Open();
          Thread workerThr = new Thread(new ThreadStart(run));
          workerThr.start();
       }
     
     
       private void run()
       {
          //hier kannst du jetzt auf con deine datenbank aktionen durchfuehren
          //da jeder thread seine eigene Verbindung hat 
       }
    }

    und einen neuen Thread startest du jetzt indem du einfach aus deinem Hauptprogramm ein neues Worker object erstellst
    In den Worker kommt dann auch deine ganze logik rein, was der thread machen soll...

    hoffe, das hat geholfen
     

Ähnliche Themen

  1. Testfrage bzgl. generic methods / Typparameter
    Von Steve222 im Forum Java Grundlagen
    Antworten: 4
    Letzter Beitrag: 08.09.10, 22:33
  2. First Class Methods in Java
    Von Thomas Darimont im Forum Java
    Antworten: 3
    Letzter Beitrag: 26.02.08, 09:59
  3. Antworten: 0
    Letzter Beitrag: 05.02.08, 11:53
  4. Bridge Methods
    Von Thomas Darimont im Forum Java
    Antworten: 0
    Letzter Beitrag: 20.06.06, 11:14
  5. eclipse Fehlermeldung: obsolete methods
    Von helavi im Forum Java
    Antworten: 2
    Letzter Beitrag: 25.08.04, 21:21