Gladh skrev:
nickemannen skrev:
1. Det är en smaksak, men generellt sätt så är det en datareader som används iallfall de applikationer jag sett.
Det betyder inte att det är rätt, jag har sett riktigt dålig kod i många applikationer, men absolut inget som jag tänker ta efter ;)
nickemannen skrev:
Tror inte det gör så mkt om databaskopplingen är öppen lite längre,
Det är en av de mest grundläggande saker man lär sig om databasprogrammering och det är att se till att ha så lite kod som möjligt mellan öppnandet och stängandet av din databas.
nickemannen skrev:
är den det så får man designa så att databaskopplingen inte alls är öppen längre.
Hur skall du designa bort det? Det är något som måste lösas i ORMappern, eftersom det är där som där som den öppnas och stängs.
nickemannen skrev:
Sedan får du ju dubell mappningstid om prestandan är mycket viktig så får du ju en större flaskhals när datan först måste mappas mot Datatable och sedan mot objekten
När det gäller datatable istället för datareadern så är valet av datatable givetviss ett avbräck för prestandan (även om man knappast skulle märka det, även vid höglast), men skalbarheten ökar och man får bättre avskillningar mellan sina lager.
Vad många tycks glömma när man disskuterar hur länge en databaskoppling skall vara öppen, är att jag som utvecklar inte har en j-vla anning om när min kod kommer att exekveras, eftersom jag inte styr när min tråd skall få köras, det betyder att även om jag endast har en enda kodrad mellan öppnandet och stängandet av databasen så kan det tar en "bra stund" innan den raden är exekverad, eftersom "datorn" tycker att andra trådar är viktigare att exekverar än just den jag tycker är viktigast.
En annan sak som många verkar tycka är att den lila extra tid som databaskopplingen är öppen är inte så farligt, det är inte så många användare med mitt system, problemet är ju bara att de oftas är många applikationer som skall använda samma databas, och då blir det helt plötsligt väldigt intressant att se till så att man stänger ner antalet öppna kopplingar så snabbt som möjligt.
I vanliga hobbyprojekt där man sitter själv med en SQLdatabas och programmerar emot, så spelar det mindre roll, men om man börjar koppla upp sig mot en databas som redan är tungt belastat från en massa andra applikationer så kommer det märkas om du håller din databaskoppling öppen längre än nödvändigt, och när det märks så kostar det bra mycket mer än vad den "dubbla mappningen" kostar.
Prestanda och skalbarhet går aldrig hand i hand, ökar man det ena så minskas det andra, men det är f-n så mycket "billigare/lättare" att slänga till en server extra i slutändan, än att gå från extremt prestandakod till skalbar kod...
Men man utvecklar sin kod som man själv vill, eller ja, så som din arkitekt berättar för dig hur koden skall se ut...
- M
Självklart menar jag designandet av OR/Mappern eller det lagret som använder sig av det. Som det nämdes tidigare med en Factory som tar emot DataReadern och som har per default ansvar att stänga datareadern och när datareadern stängs så stängs också anslutningen.
Det där du pratar om med en rad stämmer inte alls, bara för att du anropar Ramverket med en rad behöver inte det betyda att det anropet körs klart innan den kan byta tråd, utan det kan den göra även när du anropar ramverksspecifika metoder.
Dvs den kan lika gärna avbrytas när ramverket håller på och fyller Datatable som när du fyller objekten med en datareader.
Håller inte riktigt med när det gäller antalet rader kod mellan öppningar och stängningar utan mer tiden det tar att exekvera koden imellan, en kodrad kan ju ta längre tid en 3 t.ex. om man anropar ramverket.
Sedan om nu man använder sig av DataTable och inte DataReader så tycker jag det är dumt att mappa över den, lägg den hellre som datakälla i objektet..
Customer(DataRow dataRow);
Och använd er av dataRow:ens, reject, commit, save, delete, clone osv... :)..
Sedan det här med komplexiteten, använder man sig av ett lager för Dataåtkomst dvs ett lager som kommunicerar med databasen som sedan lämnar ifrån sig en reader som automatiskt stänger kopplingen när readern stängs och litar på lagret ovanför eftersom det följer ett designmönster som t.ex. Factory som det länkades till ovan så har du inte förhöjt komplexiteten något utan gjort i princip exakt samma sak bara det att det läggs till en rad i mappningsmetoden som stänger datareadern :).
Följer man det designmönstret så tror jag knappast att det blir några problem.
Men hur som helst så tycker jag att NHibernate passar de flesta fall eftersom här sköts allt detta åt dig, plus att man får en hel del andra möjligheter :).