Store filer i databasen
- Thursday, January 8th, 2009
- Skriv en kommentar
For tiden er jeg opptatt med å løse noen problemer vi har i produktet vårt relatert til dokumenthåndtering. Vi lagrer dokumentene som blobber i databasen, og de siste dagene har jeg kommet over flere eksempler på hvor lett det er å gjøre ting feil i slike senarier.
WTF 1:
For å håndtere store filer er vi nødt til å splitte dem opp – vi kan ikke behandle de komplette filene i minne. Før vi splitter opp ønsker vi å finne størrelsen på filen. Og hva gjør vi da? Jo, vi laster hele filen i minne og sjekker lengden!
Det verste er at filstørrelsen allerede finnes lagret i et eget felt i basen, men av en eller annen grunn stoler vi ikke helt på denne, og velger å gjøre det på den kostbare måten som får serveren til å knele for store filer.
WTF 2:
Et annet, morsomt eksempel vi kom over i går var koden for å slettemarkere en fil. Alt som skal gjøres er å flippe en bit fra true til false (eller var det muligens motsatt?). Men for å gjøre det laster vi først hele raden fra databasen, som desverre også inkluderer fil-blobben. Så hvis noen for eksempel vil slettemarkere en fil på 100MB, så leser vi først 100MB fra databasen før vi endrer vår bit fra 1 til 0 og oppdaterer.
Nå må ingen føle seg støtt av disse historiene. Alle kan gjøre slike ting fra tid til annen – de fleste, om ikke alle, gjør slike ting fra tid til annen. Men i et stort prosjekt i stadig utvikling er det viktig å sette av tid til å fange opp og jobbe med problemer som disse – spesielt når det dreier seg om produktets absolutte kjernefunksjonalitet.
Jeg garanterer en stor forbedring i neste patch!
Kategorier: Jobb, O/RM & databaser, WTF.
RSS feed for kommentarene.
Tilbaketråkk.



January 8th, 2009 at 11:59 am
Det som også er viktig å huske på når en kommer over slikt – er at kanskje det ikke var en problemstilling i utgangspunktet.
Og om en senere oppdager slikt i egen kode/skjemmes når andre oppdager det – så betyr det jo at en har utviklet seg i mellomtiden :)
January 8th, 2009 at 7:28 pm
>det ikke var en problemstilling i utgangspunktet
Problemet er at kravene til løsningen bare øker og øker, og at man da i stedet for å revurdere designet bare lapper og teiper på raske løsninger. Til slutt sitter man med et monster av en løsning som ingen vet hvordan virker :)
WTF nr. 2 var forøvrig ikke helt riktig – sitasjonen var faktisk enda værre. Det som skulle gjøres var mer eller mindre en DELETE FROM, men raden – som inneholdt blobben – ble lastet først. Og ikke bare en gang, men en gang for hver gang filen hadde blitt revidert (nøyaktig samme filen).
Men refakturering er faktisk veldig gøy, selv på kode som dette..
March 18th, 2009 at 8:39 pm
Kjempebra at du “tør” å skrive om slike ting. Jeg leser det overhodet ikke som kritikk av den som har gjort det, for vi har alle sammen gjort slike ting, og som Tormod også sier, det funka da det ble laget.
Det er slike ting man lærer godt av, og spesielt at alt endrer seg over tid og med data.
Fortsett med slike – det er moro å lese – og lærerikt.