Avatar billede forgalt Nybegynder
18. september 2003 - 14:27 Der er 10 kommentarer og
1 løsning

webservice med singleton objekt

Jeg er ved at lave en webservice der tilbyder database adgang. For at synkronisere database adgangen forsøger jeg at lade min webservice sende kaldet til databasen videre til en singleton klasse. Dette virker dog umiddelbart ikke. Er der nogen der kan se fejlen?

Selve webservicen:
public class Service1 : System.Web.Services.WebService
{
  private static Singleton s;
  public Service1()
  {
    s = Singleton.getInstance();
  }
}
[WebMethod]
public void testMethod(string st)
{
  Console.WriteLine("Kalder add i testMethod");
  s.add(st);
}

Og her singleton klassen:

public class Singleton
{
  private static Singleton singleton;
  private Singleton()
  {
    Console.WriteLine("Constr.Singleton");
  }
  public void add(string s)
  {
    lock(this)
    {
        while(true)
                  Console.WriteLine(s);
    }
  }
  public static Singleton getInstance()
  {
    if(singleton==null)
    {
            Console.WriteLine("getInstance() udfører new => singleton var == null");
        singleton = new Singleton();
    }
    return singleton;
}

Så tester jeg på følgende måde:

Service1 ws = new Service1();
string s = Console.ReadLine();
ws.testMethod(s);

denne consol applikation starter jeg så 2 af. Eftersom metoden add på singleton klassen kører uendelig bør kun den ene metode få lov at køre. Men nej....de kører begge fint derudaf.
Avatar billede arne_v Ekspert
18. september 2003 - 14:46 #1
Hvrrdan kan du se at begge add'er kører og at det ikke bare er den ene der
kører og den anden venter ved lock ?

De udskriver jo det samme !
Avatar billede forgalt Nybegynder
18. september 2003 - 14:51 #2
Fordi i main står der string s = Console.ReadLine(); her indtaster jeg en streng som medsendes til testMethod(s), og videre til add(s) hvor denne streng udskrives. Ydermere starter jeg jo 2 test konsoller, og her drøner de begge bare derudaf.
Avatar billede arne_v Ekspert
18. september 2003 - 15:05 #3
To consoller skal køre derudaf.

lock virker kun inden for samme (multithreaded) program !

(og i web service sammenhæng = på serveren)
Avatar billede forgalt Nybegynder
18. september 2003 - 15:10 #4
okay....hvad gør man så? er det monitor man skal anvende istedet for?
Men der er stadig tale om at der bliver oprettet 2 singleton objekter. konsollerne udskriver linien fra singleton i begge tilfælde:

Console.WriteLine("getInstance() udfører new => singleton var == null");

Det kan godt være at min lock ikke virker, men burde der ikke kun blive oprettet en instans af singleton.
Avatar billede arne_v Ekspert
18. september 2003 - 15:18 #5
singleton begrebet gælder kun indenfor en kørende process (og giver derfor
kun mening for en multithreaded process).

Men er det et reelt problem ? Alle kald til en web service burde vel
også køre som tråde indenfor samme process server side !?
Avatar billede forgalt Nybegynder
18. september 2003 - 15:53 #6
Det er også en af de tanker jeg har gjort mig. Jeg kan blot konstatere at hvis jeg opretter 2 klient processer, der hver kalder en webservice, der igen kalder en metode på et singleton objekt, så er der ikke tale om samme singleton objekt.
Avatar billede forgalt Nybegynder
18. september 2003 - 15:53 #7
så hvordan man kan klare synkroniserings problemet med en webservice kan jeg pt. ikke lige se nogen løsning på
Avatar billede roger Nybegynder
18. september 2003 - 22:40 #8
Application.Lock();
//din kritiske kode
Application.UnLock();
Avatar billede nielslbeck Nybegynder
19. september 2003 - 09:08 #9
Hvorfor er det i hele taget du vil synkronisere din database adgang? I langt de fleste tilfælde er det overhovedet ikke nødvendigt, og hvis det virkelig er, vil transactions være langt mere effektive da databasen er langt smartere opbygget end du kan opbygge dit C# program...
Avatar billede arne_v Ekspert
19. september 2003 - 09:34 #10
Transactions (heller ikke med transaction isolation level serializable)
laver ikke ikke det samme som sådan en lock.
Avatar billede nielslbeck Nybegynder
19. september 2003 - 09:36 #11
Nej, men de gør, at der ikke går ged i databasen - og det var jo det forgalt startede med at skrive at han ønskede...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester