webForumDet fria alternativet

Arkitekturdesignfråga

.NET

9 svar · 546 visningar · startad av Nickemannen

Medlem sedan aug. 20003 575 inlägg
Frågan#1

Jag utvecklar i ett system som mer eller mindre är byggt på dataset och datatable's vilket jag ser både nackdelar och fördelar i.

Men nu min fråga hur borde man agera mellan Presentationslagret och businesslagret?

Skall man skicka upp hela dataset:et om man skall hämta data från en eller flera tabeller? Skall man skapa upp tabeller på businesslagret som matchar precis det man skall visa eller skall man skicka med allt och med DataView.Rowfilter filtrera det som skall visas i presentationslagret, eller skall dataviewn bli ändrad i businesslagret?

Medlem sedan maj 20012 812 inlägg
#2

Om du jobbar i .NET 2.0 och det är en winforms applikation så tycker jag du skall läsa på om hur Binding objekten har ändrats och förbättras, det är möjligt att detta är vad du vill ha.

Generellt så kan man väl säga:
1. Hämta inte mer data än du behöver
2. Cacha datan på klienten så du slipper hämta data i onödan, hämta gärna mer data 1 gång än lite data flera gånger.
3. Försök kombinerar 1 och 2 så det blir bra och jag bjuder dig på glass ;)

Jag brukar inte använda mig av dataset och datatables utan egna entiter och lister av dessa entiter. Då hämtar jag (oftas) endast den data som jag vill presenterar upp i mitt presentationslager.

- M

Medlem sedan nov. 20041 189 inlägg
#3

1. torde väl vara business <-> data layer.

När jag jobbar som du säger, så använder jag ett lager som bara har metoder för att returnera DataSet, DataTable, object (dvs. en scalar) eller IDbCommand (för att sedan kunna skickas tillbaka).

Sedan har jag ett provider layer som är mer likt business-lagret. Där har jag funktioner som GridView, ObjectDataSource etc, kan binda till och även använda för att modifera datan. Rikligt med overloads här med.

Ska man sedan syssla med Web Services, Externa data, bildhantering eller liknande så hade jag lagt till ett lager till som hanterar den logiken och kallat det för business layer och sedan kallat lagret under för provider layer. Men om det bara krävs tre lager så hade jag skickat generics från business/provider layer.

Mitt provider layer hade då beställt upp en datatable från datalagret genom att skicka en IDbCommand som parameter till en funktion i Data Layer, sedan hade den fått iterera genom raderna och skapa objekt för varje rad, och sedan returnera en List<MittObjekt> till ObjectDataSource eller till min codefile genom sätta egenskapen gridview.DataSource.

Någon som gör som jag?

Men nu har jag börjat använda NHibernate och det är riktigt underbart att använda. Mkt snabbare att utveckla med än det jag beskrev ovan också! (såvida det inte är jättesmå applikationer, men även har tror jag nästan NHibernate är snabbare när man kan det)

Medlem sedan aug. 20003 575 inlägg
#4

Tyvärr så kör applikationen fortfarande 1.1 kommer väl att höjas upp till 2:an vid årskiftet då det är release.
Hmmm, detta med att inte ladda upp all data till presentationen tycker jag om eftersom det blir mycket tungt att filtrera med rowfilter om man har många poster.

Just i mitt fall handlar det om datum som man filtrerar mellan då kan det ju vara bra att ta in mellan dom 2 datumen som angivits till datatabeln och om dom redan tagits in så känner datalagret av detta och skippar att ta in det.

Precis som du säger Gladh så hade inte jag heller använt mig av DataSet och DataTable's från grunden men det är bara att gilla läget för mig. Och det är ett krav att det är Ms Sql server så någon NHibernate blir det tyvärr inte heller :(.

Medlem sedan maj 20012 812 inlägg
#5

nickemannen skrev:

Just i mitt fall handlar det om datum som man filtrerar mellan då kan det ju vara bra att ta in mellan dom 2 datumen som angivits till datatabeln och om dom redan tagits in så känner datalagret av detta och skippar att ta in det.

Det där är så himmla svårt. För om du vill öka din prestanda så plockar du hem all data från databasen lägg i din cache och sedan så låter du business lagret filtrera ut den datan du vill ha när den efterfrågas, om du då gör många filtreringar så kommer det gå ruggigt fort och din applikation kommer upplevas som snabb. Men vad händer när datamängden börjar närma sig flera hundratusen rader som du hämtar för att lägga icachen, och om du då endast vill visa poster 1 gång och detta inte rör sig om mer än typ 1dag (alltså, säg 20 poster) så är det istället en prestanda sänkning du gör när du hämtar alla hundratusentals poster från databasen till din applikation.

Generrelt så skulle jag säga så här:
Har du data som används ofta och som är inte är så mycket (typiskt kategorier i en webshop) så plocka upp den ur databasen och lägg den i cache i din applikation. Har du istället massor med data och du inte riktigt vet hur mycket av denna data som skall användas och hur mång gånger, så hämtaden varje gång från databasen.

Nu kan man försöka bygga in smarta algoritmer för att använda sig av cachen men detta blir svårt.
Säg att du filtrerar på 2 datum. 2006-01-01 till 2006-05-01. Hämtar dessa och lägger i cachen. Nu kommer jag sen och söker på 2006-02-01 och 2006-03-01. Denna data finns i cachen, men inte så enkelt så jag bara kan hämta den, utan jag måste kontrollera så att datumen passar in, de gör det och jag hämtar ut min delmängd från cachen...
men om jag istället söker på 2006-01-01 till 2006-06-01 så finns inte de sista dagarna och skall jag så fall bara hämta den sista månaden eller alla poster.

Och sedan den sista och helt klart nästan ommöjlig att lösa. Jag söker först på 2006-01-01 till 2006-03-01 och sedan 2006-06-01 till 2006-08-01. Nu har jag hämtat data 2 gånger. Nu gör jag en sökning mellan 2006-02-01 och 2006-07-01. Då kommer jag titta i min cache och säg: Bra jag har sökningar från den 2006-02-01 och från 2006-07-01, så jag tar min cachade data, men den innehåller ju inga poster mellan 2006-03-01 och 2006-06-01.

nickemannen skrev:

Ms Sql server så någon NHibernate blir det tyvärr inte heller

Kan du inte använda SQL Server till NHibernate? Det kan jag inte tro på, har aldrig använt NHibernate, men har väldigt svårt att tro att den inte skulle stödja SQL Server...

- M

Medlem sedan aug. 20003 575 inlägg
#6

Jo jag har ungefär gjort det som du beskrev i ditt senaste inlägg Gladh, men det blir segt när datan skall hämtas från cachen. Jag kör iof på ett worst case scenario med 20.000 rader. Där använder jag i för att filtrera ut data DataTable.Select(), finns det något snabbare alternativ? Ett annat alternativ jag har är att när jag får ett par datum så hämtar jag ut all data ett år runtomkring för det är där användaren antagligen kommer att hålla sig. Och då behöver jag bara fylla just det året.

Medlem sedan dec. 19996 522 inlägg
#7

SQL-server fungerar utmärkt till Nhibernate. Vi kör på en SOA-arkitektur (Nhibernate och mssql-05 i grunden, nhibernate i ett eget domainlayer) med service interface som returnerar dto:er eller listor med dto:er

Medlem sedan maj 20012 812 inlägg
#8

nickemannen skrev:

Jag kör iof på ett worst case scenario med 20.000 rader. Där använder jag i för att filtrera ut data DataTable.Select(), finns det något snabbare alternativ?

Nu jobbar jag inte med DataTable så jag vet inte hur bra det är på filtering, men en databas med rätt index är garanterat snabbare på att plocka ut rätt data till dig än vad DataTablens select är, kan inte tänka mig att det finns index till DataTablen. Så du kanske skall tänka om i det fallet när det ändå rör sig om så många rader som 20000. Har du en bra SQL Server i botten och bra lina mellan SQL Servern och klienten så kommer du säkert märka en förbättring. Man måste dock tänka på antalet samtidiga användare, är det så att det sitter ett hundratal klienter och frågar mot databasen hela tiden så är det nog bättre att cacha det lokalt på klienten...

- M

Medlem sedan aug. 20003 575 inlägg
#9

Det kan vara flera som arbetar om databasen, tror inte det är själva belastningen på servern som är problemet utan mer överföringen av data lina osv iallafall är det informationen jag fått.
Kan tilläggas att jag bara underhåller applikationen och bygger ut mer funktionalitet, jag skrev om urvalsalgorithmen lite och det visade sig att 20.000 poster inte är särskilt prestandakrävande med den nya urvalsalgorithmen. Jag har också gjort en cache som känner av om datan redan finns eller ej. Och om det saknas data så hämtas den som inte finns och laddas in i DataSet:et/DataTabellen.
Sedan kör jag en DataTable.Select mot datatabellen och får ut dom rows jag vill presentera. Detta flyter ganska smidigt och jag är ganska nöjd med det.
Hade jag fått välja från början hade jag nog skippat DataSet och datatabeller.

Medlem sedan maj 20011 312 inlägg
#10

Intressant tråd! Jag tänkte tipsa om en tråd där jag gjorde lite prestandatester kring olika funktioner för att leta upp visa rader i en datatable och radera raderna. Kanske kan du ha nytta av resultatet:

http://www.webforum.nu/showthread.php?t=145921

296 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
149 ms — deklarationer (db)
0 ms — hämta statistik (cache)
144 ms — hämta tråd, inlägg och bilagor (db)
142 ms — ändringar (db)