Jag har tänkt att lägga in en cache funktion i min DataManager klass när jag väl får tid till detta.
Jag förstår dock inte riktigt vad du menar med lustiga resultat, det en cache gör är att den spara prestanda, du kan mycket väl få felaktiga värden med en cache, allt beror på vad du menar och hur du implementerar det.
Så här har jag gjort/kommer att göra:
Säg att jag har klassen Person. denna klass har sin data lagrad i en databas som matchar min klass. Alltså alla variabler i klassen har en kolumn i databasen.
Jag har nu en DataManager klass som fyller min klass med data från databasen och även spara ner data till databasen.
Så säg att jag skapar ett ny person och vill spara den, då gör jag så här.
CPerson oPerson = new cPerson("SP_SAVEPERSON");
oPerson.Firstname = "Magnus";
DataManager.Save(oPerson)
Jag har nu skapat ett nytt objekt, gett det data och sedan sparat ner det till databasen. Vi säger att den får ID= 1.
Om jag sedan vill hämta datan från databasen så gör jag så här:
CPerson oPerson = new CPerson("SP_GET_PERSON_BY_ID");
oPerson.ID = 1:
DataManager.Load(oPerson)
Då laddar jag upp mitt objekt från databasen.
För att implementera en cacheing funktion så är den bästa plats för detta i min DataManager-klass. Alltså när jag vill ladda upp en person med ID=1. Så kollar jag först om jag har ett sådant objekt i cachen. Detta gör att jag slipper hämta datan från databasen och kan så sätt spara prestanda.
om jag sedan spara mitt objekt till databasen, så kollar jag i min cache om objektet finns och så fall. Tar jag bort det från cachen. Vilket betyder att nästa gång man vill ladda så hämtar jag det från databasen och får ny fräsch data. Man behöver inte ta bort objektet från cachen, utan man kan istället bara byta ut objekten i cachen.
Jag har nu tjänat prestanda men, har ju inte på något vis säkrat mig från "lustiga resultat". Problemet jag får är att om flera program skall använda samma data i databasen, så måste jag ha 1 cache för alla dessa program, annars så kan jag få korrupt data. Här kommer ett exempel där 2 program med 2 cachar delar på samma data i databasen.
Prog1. Hämtar Person med ID=1 från databasen. Ser att FirstName=Magnus och lägger denna i cachen.
Prog2. Hämtar Person med ID=1 från databasen, lägger i cachen och ändrar FirstName från Magnus till Pelle, och spara ner till databasen. objektet plockas bort från Prog2 cache.
Prog1. Hämtar nu en ny person med ID=1. prog1 ser att objektet finns i cachen och visar denna person. Problemet är att här är Firstname= Magnus och inte Pelle som det står i databasen. Här har vi då fått korupt data.
Om Prog1 och Prog2, istället hade delat på cachen hade detta problem aldrig uppsått.
Din cache skall spegla hur din databas ser ut, och endast finnas för att prestanda skall bli bättre.
- M