J'essaie de configurer correctement un cache côté serveur et je suis à la recherche de critiques constructives sur l'installation que j'ai actuellement. Le cache est chargé lorsque la servlet démarre et ne change plus jamais, c'est donc un cache en lecture seule. Il doit évidemment rester en mémoire pour la durée de vie du Servlet. Voici comment je l'ai configurationConfiguration correcte d'un simple cache côté serveur
private static List<ProductData> _cache;
private static ProductManager productManager;
private ProductManager() {
try {
lookup();
} catch (Exception ex) {
_cache = null;
}
}
public synchronized static ProductManager getInstance() {
if (productManager== null) {
productManager= new ProductManager();
}
return productManager;
}
Le cache est configuré par le Servlet comme ci-dessous:
private ProductManager productManager;
public void init(ServletConfig config) throws ServletException {
productManager = ProductManager.getInstance();
}
Et enfin, voici comment je y accéder:
public static ProductData lookup(long id) throws Exception {
if (_cache != null) {
for (int i = 0; i < _cache.size(); i++) {
if (_cache.get(i).id == id) {
return _cache.get(i);
}
}
}
// Look it up in the DB.
}
public static List<ProductData> lookup() throws Exception {
if (_cache != null) {
return _cache;
}
// Read it from the DB.
_cache = list;
return list;
}
Comment, en particulier, dois-je aller sur le fil sécurité? Blocs synchronisés et/ou classes de collection simultanées? – bluedevil2k
Les collections simultanées ne vous aideront pas parce que je crois que vous chargez le cache une fois et après ce point, il ne change pas. La deuxième méthode 'lookup' - qui charge réellement le cache - doit être' synchronisée'.Autrement, deux threads pourraient tous les deux trouver que '_cache' est' null' et peuvent tous deux essayer de charger à partir de la base de données. –