[ Lazar-I @ 06.06.2003. 12:48 ] @
problem u pseudo kodu (za konkretni programčić koristim C#):

class CDatabase
{
..............CObj GetObj(int id)
.............{
..........................if( Objekat se nalazi u keshu )
..........................{
...................................... Procitaj iz kesha
...................................... return obj;
......................... }
..........................else
..........................{
......................................Procitaj iz baze
......................................Dodaj u kesh
......................................return obj;
..........................}
.............}
}
Problem je kada ukloniti referencu na objekat iz keša. Naravno trebalo bi onda kada sem reference iz keša ne postoje druge reference na objekat.

Moje resenje je:

............ keš je implementiran hashTabelom

............ Procitaj iz kesha(id)
............ {
......................... hashTabela[id].BrojReferenci++;
......................... return hashTabela[id].obj;
.............}

.............dodaj u kesh - BrojReferenci=1

Klasa CObj bi morala da ima metod

............ UkloniIzKesha()
............ {
......................... hashTabela[id].BrojReferenci--;
......................... if(BrojReferenci<1)
...................................... hashTabela[id].Remove();
............ }


Problem kod ovog resenja je

1. Mora se pozivati metod UkloniIzKesa()- da se nebi desilo da prevučem celu bazu na aplikativni server

2. Operacija dodele moze uzrokovati nepredvidjene rezultate, npr.

CObj obj1=database.GetObj(34);
CObj obj2=obj1;
obj1.UkloniIzKesa();
CObj obj3=database.GetObj(34);

Sada obj2 i obj3 predstavljaju isti objekat - id=34, ali postoje 2 instance tog objekta, pri cemu se obj2 ne nalazi u keshu.


Ovo resenje je jednostavno ali lose, ima li neko bolje rešenje, ali da je takođe jednostavno ?
[ Dragi Tata @ 06.06.2003. 18:17 ] @
Mislim da je ovde problem:

Citat:
Problem je kada ukloniti referencu na objekat iz keša. Naravno trebalo bi onda kada sem reference iz keša ne postoje druge reference na objekat.


U principu, nism čuo da se keš implementira na taj način. Ne verujem da je bitno da se objekat ukloni iz keša čim broj referenci padne na nulu. Ja bih napravio keš tako da se objekti čuvaju "izvesno vreme", ili dok se keš ne napuni pa onda da se "starosedeoci" prvo bišu. Naravno, treba obratiti pažnju i da se kod svake promene (brisanja) baze istovremeno izvrši i provera keša.
[ Reljam @ 06.06.2003. 19:01 ] @
DT, sjajna ideja! I ja bi napravio takav cache, a posle bi ga nazvao System.Web.Caching.Cache :D

Salu na stranu, ime klase nije bas najsrecnije jer implicira da ima nekakve veze sa webom. U stvari nema, radi na (string, object) parovima, podrzava expiration, priority, i ima callbackove kada neki cache entry expireuje. Vrlo lepa stvar. Verovatno bi bilo bolje da su ga smestili u Collections.
[ Dragi Tata @ 06.06.2003. 19:30 ] @
Hehe, od sad kad god neko nešto pita, prvo gledam MSDN, pa onda odgovaram. Pitam se samo da li u FCL-u postoji klasa za kuvanje kafe...