18. september 2003 - 14:27Der 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.
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.
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.
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.
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...
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...
Synes godt om
Ny brugerNybegynder
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.