Avatar billede apocryphal Nybegynder
22. april 2004 - 14:27 Der 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?

--
Jonas
Avatar billede burningice Nybegynder
22. april 2004 - 14:47 #1
ja, det er den samme... så hvis du arbejder med flere tråde skal du lave en lock() på din connection.

Ang åbne/lukke, så er det gode kode-praksis, lige at tjekke/åbne din connection inden du begynder at arbejde med den
Avatar billede apocryphal Nybegynder
22. april 2004 - 14:50 #2
Er der andre måder at gøre dette på, som giver mulighed for at flere connections fra connectionpoolen, kan arbejde asynkront?

Jeg arbejder ikke med flere tråde insentionelt - men det gør IIS vel?
- eller afvikler den alle HTTP requests synkront?
Avatar billede burningice Nybegynder
22. april 2004 - 14:59 #3
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?
Avatar billede apocryphal Nybegynder
22. april 2004 - 15:03 #4
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.
Avatar billede burningice Nybegynder
22. april 2004 - 15:19 #5
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.
Avatar billede pelkjaer Nybegynder
22. april 2004 - 15:21 #6
I denne forbindelse, kan jeg kun KRAFTIGT anbefale denne "object mapper" http://www.thona-consulting.com/content/products/entitybroker.aspx

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).
Avatar billede burningice Nybegynder
22. april 2004 - 15:25 #7
pelkjaer>> den mapper jo kun objecter i .Net til tilhørende tabeller i databasen. Problemet her er vel at lave en form få synkroniseret adgang.
Avatar billede apocryphal Nybegynder
22. april 2004 - 15:26 #8
Factory-pattern? Hvad er det? :)

Det samme som med Java, ala: Selector selector = Selector.open(), i stedet for et new statement?
Avatar billede burningice Nybegynder
22. april 2004 - 15:34 #9
det er en måde hvorpå man kan returnere en bestemt type (ud fra flere mulige) ud fra nogle paramtre:

her er et eksempel http://www.c-sharpcorner.com/Code/2003/Jan/SimpleFactoryPattern.asp
Avatar billede apocryphal Nybegynder
22. april 2004 - 15:41 #10
Yes - det er ligesom med Activator-klassen...

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.
Avatar billede burningice Nybegynder
22. april 2004 - 22:46 #11
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.
Avatar billede apocryphal Nybegynder
23. april 2004 - 09:32 #12
Ja ok, det har du ret i :)
Avatar billede apocryphal Nybegynder
23. april 2004 - 12:31 #13
Nå, vi må vel hellere lukke dette emne?

cyberprofessor> du svarede jo faktisk på mit spørgesmål, så det er vel kun retfærdigt at points tilfalder dig.
Avatar billede burningice Nybegynder
23. april 2004 - 12:34 #14
svar :)
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