webForumDet fria alternativet

objektcache

2 svar · 234 visningar · startad av Walker

WalkerMedlem sedan okt. 2002188 inlägg
#1

Hej

Jag sitter och filar på ett objektrelationsmappnings ramverk och just nu så tänkte jag fixa mig en datacache eller objektcache kanske man skulle kalla det. Anledningen till att jag vill ha en datacache är att jag inte skall kunna ladda samma objekt två gånger, och på så sätt få lustiga resultat. Datacachen skall också hålla ordning på vilka objekt som blivit ändrade, borttagna och så vidare. Just nu så har jag gjort det så att jag använder mig av ett antal listor för varje objekttyp.

Men.. detta är ju i princip vad datasets är. De innehåller det ursprungliga värdet samt det nya osv.. Så jag funderar på att byta ut min cache till datasets istället, detta kan lösa en hel del problem för mig, men jag tänkte kolla om det är någon som har några synpunkter eller erfarenheter av detta innan jag ändrar...

/w

GladhMedlem sedan maj 20012 812 inlägg
#2

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

WalkerMedlem sedan okt. 2002188 inlägg
#3

Hej

Har tappat tråden för hur jag tänkte när jag skrev det, har kikat på en del opensource projekt och deras sätt att lösa det, så nu har jag ett annat synsätt på det. :r

Usch, alldels för mycket i huvet.. dags för lite :bire

127 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)