2013-03-14 14 views
5

Vorrei memorizzare i dati nella mia applicazione web Spring MVC. Poiché sono nuovo anche in Spring Framework e nell'architettura MVC, vorrei chiedere se dovrei memorizzare i dati nella cache (tramite Spring Caching system) sul livello DAO o dovrei memorizzare i metodi di uscita su un livello di servizio?Devo fare il caching sul livello DAO o sul livello di servizio nell'app web Spring MVC?

E.g. Ho questo metodo su un livello di servizio:

@Override 
public LinkedList<OrderCount> getOrderCount(Date dateFrom, Date dateTo, Class type) { 
    try { 
     return chartDataDAO.getOrderCount(dateFrom, dateTo, type); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

e questo metodo chiama questo metodo DAO:

public LinkedList<OrderCount> getOrderCount(Date dateFrom, Date dateTo, Class type); 

La mia domanda è: devo fare il caching sul livello di servizio o DAO?

+0

Poiché si tratta di una domanda di tipo "best-practice", suggerirei di postarla su codereview.stackexchange.com o su programmers.stackexchange.com - entrambi sono luoghi migliori per una discussione più aperta su cosa costituisce codice e architettura "opportunamente formati". :) Sono felice che tu abbia avuto una risposta qui! –

risposta

6

In primo luogo, non andare avanti. Prima di fare il caching, assicurati di averne bisogno. Il caching può migliorare le prestazioni, ma introduce un'intera gamma di mal di testa (principalmente a causa della perdita di coerenza dei dati).

In secondo luogo, se si fa la cache, quando possibile utilizzare framework di terze parti come EHCache e simili (sì che è strato di dati)

In terzo luogo, nel tuo esempio, la tua firma metodo mi fa pensare che sia improbabile che si otterrà la stessa richiesta molte volte. Memorizzare la risposta a getOrderCount(January 27, January 28, String) non ti aiuterà quando avrai ottenuto la richiesta di getOrderCount(March 21, March 28, Vector). A meno che non ci sia un certo valore per la tua logica di business, è probabile che venga richiesto molto, e il calcolo del risultato è abbastanza pesante, la cache (se presente) dovrebbe andare nel livello dati.

3

Penso che il caching si adatti al livello di servizio se si sta facendo un caching più sensibile al contesto. Ad esempio il supporto per il blocco ottimistico di un risultato di una query che può essere impaginato da un'API del servizio Web o da un supporto Etag. Ciò presuppone un approccio di caching diretto (non dichiarativo) come l'uso diretto di EhCache.

Se si utilizza il caching dichiarativo di Spring per tentare di migliorare le prestazioni generali, potrebbe essere utile memorizzare i metodi nel livello DAO. Non sono sicuro che ciò consentirà alcun vantaggio sulla memorizzazione nella cache che potrebbe già essere implementata con il tuo ORM; la modalità ibernazione, ad esempio, supporta una varietà di livelli di cache per migliorare le prestazioni del database.

Problemi correlati