Avatar billede Syska Mester
24. maj 2008 - 19:16 Der er 9 kommentarer og
1 løsning

Singleton og LINQ DataContext klasse

Hej,

Jeg er ved at udvikle et site i ASP.NET.

Der skal jo selvf en del gange laves en ny instance af min DBDataContext da jeg bruger LINQ ...

Kunne man ikke med fordel smide den ind i en Singleton klasse, så det altid var den samme med brugte, i ens forskellige methods og class som bliver kaldt gennem execution af siden ?

Ville det være den samme instance worker processen fik fat i ? tænker på hvis man har mange samtidige brugere ? eller hvordan ville det komme til at virke ? Dvs der ville kunne komme konflikter når jeg fik flere aktive brugere på samme tid ?

// ouT
Avatar billede arne_v Ekspert
24. maj 2008 - 21:42 #1
En DataContext indeholder mig bekendt en Connection. Så at lade flere steder
bruge samme DataContext betyder at flere steder vil bruge samme Connection.
Det lyder ikke godt.
Avatar billede Syska Mester
24. maj 2008 - 22:46 #2
Ja ... men nu gik det et eller andet sted også mere præcis på hvordan det ville opføre sig i et ASP.NET miljø ...

Vi kører jo fra A til B ... og min ASP.NET application er single threaded ... men hvad sker der når flere brugere er på ... er det samme DataContext de får fat i ?

Tænker en måde, da der måske er nogle data der kan genbruges  som hentes et sted, og som måske ligeså godt kunne bruges et andet sted senere i min execution ...
Avatar billede Syska Mester
24. maj 2008 - 22:53 #3
Hvis det er samme datacontext ... hvordan kan man så lave så det er den samme, kun for den bruger ?
Avatar billede arne_v Ekspert
24. maj 2008 - 22:54 #4
En single threaded ASP.NET app ?

ASP.NET apps er vel altid multi threaded. Forskellige requests kan køre parallelt.

Hvis du mener at lave en DataContext per page men genbruge den flere gange i processingen
fordi dine requests er relativt tunge, så er det en mulighed, men generalt anses det for skidt
at holde på Connection's længe, så jeg vil stadig anbefale at lave efter behov og lukke
igen.
Avatar billede arne_v Ekspert
24. maj 2008 - 22:57 #5
Per bruger ?

Hm.

- gem DataContext i Session
- hav et flag som markerer om den er i brug
- for en request tester du om den allerede er i brug og returnerer en fejl side hvis den er

Jeg synes ikke at det lyder tiltalende.
Avatar billede arne_v Ekspert
24. maj 2008 - 23:00 #6
Men måske er jeg bare en gammel gnaven mand.

:-)
Avatar billede Syska Mester
25. maj 2008 - 15:19 #7
Ja, w3wp.exe er multithreaded ... men min process linje når siden laves er single ... altså jeg starter ikke nogle processes og venter på dem ... kunne ikke lige finde på andre ord for det ...

Nu tager et page request jo ikke mere end omkring 50 ms ... og sådan en LINQ to SQL ... sørger selv for at åbne og lukke, så jeg vil da mene at den stadig bruger connection polling behind the scenes ... så kan ikke helt se dit problem du sætter op ...

Tænkte også mere på om der var noget at vinde ved det ... altså at genbruge den ved hvert page request ... men det lader ikke helt til at der er det ...

Gnaven mand mener jeg da ikke du er ... tror jeg manglede ord for at beskrive mit egentlig problem/bekymring godt nok ... kunne have afhjulpet det.

Men bottom line, det er den samme klasse jeg får fat i hvis jeg bruger Singleton ... så jeg tror bare jeg biholder den måde jeg har lavet det på nu ... :-)
Avatar billede arne_v Ekspert
29. maj 2008 - 04:50 #8
DataContext bruger connection pool fordi Connection hentes fra connection pool.

Men god skik og brug for connection pool er:
- reserver så sent som muligt
- frigiv så tidligt som muligt

Jeg googlede lige lidt.

http://blog.codeville.net/2007/11/29/linq-to-sql-the-multi-tier-story/
http://www.west-wind.com/weblog/posts/246222.aspx
http://blogs.vertigo.com/personal/keithc/Blog/Lists/Posts/Post.aspx?List=be6e3098%2D107d%2D4252%2Db250%2D528b490370c0&ID=17

Prøv og læs dem.

Min konklusion da jeg skimmede dem var:
- de er enige med mig i at det skal være per request og ikke globalt
- der er nogle problemer med at få den med ned gennem lagene som jeg slet
  ikke havde tænkt på (de har dog også en løsning)
Avatar billede Syska Mester
29. maj 2008 - 17:36 #9
smid et svar ...

// ouT
Avatar billede arne_v Ekspert
29. maj 2008 - 17:55 #10
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