22. april 2004 - 14:27Der er
13 kommentarer og 1 løsning
Central database-klasse
Hey.
Jeg spekulerer lidt på, hvordan jeg skal styrer database forbindelserne på min ASP.NET site.
P.t. har jeg oprettet følgende metode i Global: public static SqlConnection GetConnection() { SqlConnection DbCon = blablabla; DbCon.Open(); return DbCon; }
Og i min asp kaldt: SqlConnection DbCon = Global.GetConnection(); try { //blabla; } finally { DbCon.Close(); }
Mit spørgsmål er: Jeg erklærede public static SqlConnection GetConnection() - så, hvis tråd B henter en forbindelse, og lidt efter henter tråd B en forbindelse... Er disse to forbindelser så ikke den SAMME forbindelse? Den er jo static?
For hvis tråd A så lukker forbindelsen mens tråd B bruger den, så er der jo ballade?
jeg ved at hvis du har et static object i en webservice, så vil alle request's bruge den samme. Dog ved jeg ikke hvordan det er tilfældet for asp.net. Evt. kan du vel lave nogle tests og se?
Det kan godt være der ikke er nogen vej uden om. Wrox, Professionel ASP.NET 1.0 giver ikke rigtigt noget information på dette, og google har ikke været til hjælp endnu.
Ellers må jeg vel skrive en normal klasse, og ligge den der - og tage ConnectionString fra Global.
Balladen bliver så den dag, databasen f.eks. skal skiftes ud, men det kan vel løses ved at instantierer klassen dynamisk ud fra en Tekst-streng i Web.config... Spørgsmålet er bare, hvor godt det performer under peak belastning... Jeg kender ikke så meget til Activator-klassen.
jeg har lavet en database-framework som jeg bruger til alle mine web-sites. Det er baseret på at man opretter et DataStore-object hver gang man skal bruge det, og connection'en bliver først lukket i det øjeblik at en query bliver udført og lukket igen så snart at query'en er færdig.
Perfomance-mæssigt er der ingen problemer da den udnytter Connection-pooling, og jo kortere tid en connection er åben, jo bedre udnyttelse får man af Poolen.
Hvis du bruger Conefiguration.AppSettings bliver den streng du læser cachet af asp.net, så du skal ikke være bange for at læse den samme appsetting for mange gange.
Ang. databaser kan du bruger et Factory-pattern der giver dig den rigtige klasse som passer til den database du bruger.
Har I hørt om "Object Spaces" som kommer med NET 2.0/Whidbey - så er dette tool lidt det samme, blot kan det langt mere (ift. hvad man kan læse sig frem til om object spaces).
Der ser det bare sådan her ud: Type type = Type.GetType("etnamespace.entype"); EnType entype = (EnType)Activator.CreateInstance(type);
Så løsningen må være at lave en wrapper klasse til min database connection, og dynamisk instantierer den ud fra information i machine eller web.config.
Ikke helt... ved dit eksempel skal man kende til typen man vil instantiere. Hvis det ikke er tilfældet må man lave nogle if-sætninger der returnerer en given type alt efter hvilke conditions der er opfyldt.
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.