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 ?