passero
Legacy Member
Ik heb een JSF applicatie die gebruik maakt van JPA als persistentie framework.
Ik heb een bepaald object dat ik constant in memory wil opslaan voor performantie redenen. Dat object wordt elke minuut geupdate via een REST API die aangeroepen wordt door een desktop client van de gebruiker.
In de Web app gebruik ik hetzelfde object om die realtime data te tonen, Die wordt ook automatisch na 1 minuut geupdate.
In mijn eerste versie voerde elke REST API een select + update uit.
Elke request van de realtime data voerde daarbij ook een update uit.
Dit per user!
Nu heb ik mijn code aangepast en een in memory cache geschreven door gebruik te maken van een static HashMap:
Dit werkt en nu wordt er enkel een update naar de DB gestuurd.
In princiepe heb ik zelf geen DB nodig voor die data en kan ik dit object enkel in memory laten bestaan maar de DB is nodig voor het geval de client geen data heeft verzonden. Dan kan ik toch de laatste data tonen.
Nu vroeg ik me af of dit een goeie techniek is.
HashMap is voor zover ik weet niet synchronized. Is dit een probleem als ik met pakweg 100 gebruikers op de site zit en dus +/- 3 requests/seconde te verwerken krijg.
Het enige probleem dat ik momenteel zie is dat de realtime data op de website soms eens gaan missen door het niet synchronized te zijn maar op zich is dat geen ramp.
Ik heb een bepaald object dat ik constant in memory wil opslaan voor performantie redenen. Dat object wordt elke minuut geupdate via een REST API die aangeroepen wordt door een desktop client van de gebruiker.
In de Web app gebruik ik hetzelfde object om die realtime data te tonen, Die wordt ook automatisch na 1 minuut geupdate.
In mijn eerste versie voerde elke REST API een select + update uit.
Elke request van de realtime data voerde daarbij ook een update uit.
Dit per user!
Nu heb ik mijn code aangepast en een in memory cache geschreven door gebruik te maken van een static HashMap:
Code:
private static HashMap<String,Realtime> rtCache = new HashMap<String,Realtime>();
public Realtime getRealtime(Station station){
if(rtCache.get(station.getApiKey()) == null){
TypedQuery<Realtime> query = em.createQuery("select r from Realtime r where r.station",Realtime.class);
query.setParameter("s", station);
Realtime rt = query.getSingleResult();
rtCache.put(station.getApiKey(), rt);
}
return rtCache.get(station.getApiKey());
}
Dit werkt en nu wordt er enkel een update naar de DB gestuurd.
In princiepe heb ik zelf geen DB nodig voor die data en kan ik dit object enkel in memory laten bestaan maar de DB is nodig voor het geval de client geen data heeft verzonden. Dan kan ik toch de laatste data tonen.
Nu vroeg ik me af of dit een goeie techniek is.
HashMap is voor zover ik weet niet synchronized. Is dit een probleem als ik met pakweg 100 gebruikers op de site zit en dus +/- 3 requests/seconde te verwerken krijg.
Het enige probleem dat ik momenteel zie is dat de realtime data op de website soms eens gaan missen door het niet synchronized te zijn maar op zich is dat geen ramp.
.