In relazione a questa questionHibernate query cache - per oggetti non nella cache di 2 ° livello - rischioso? utile? cattive pratiche?
Premessa:
Queste sono le mie assunzioni, basate sulla mia lettura, esperienza e comprensione, si può essere sbagliato, se lo sono, si prega di commento e Io modificare la domanda .
- cache delle query è un bene per lo più lungo con cache di 2 ° livello
- cache delle query memorizza nella cache i risultati delle query identificatori + parametri
- cache di query è rischioso se il database è stato cambiato, e non si è riflesso al cache di
domanda:
ho un oggetto che non si trova nella cache di 2 ° livello. A causa di una programmazione errata o di altri vincoli, il codice che carica l'oggetto viene chiamato più volte nella stessa sessione di sospensione. Il retrival utilizza una query di ricerca HQL ad es.
hibernateTemplate.find("from Foo f where f.bar > ?", bar);
Prima di aggiungere cache delle query, se il codice di cui sopra è stato chiamato N volte all'interno della stessa sessione Hibernate, c'erano N colpisce al database
Poi ho voluto vedere cosa succede se aggiungo cache delle query:
Query query = session.createQuery("from Foo f where f.bar > ?");
query.setCacheable(true);
query.setParameter(bar);
query.list();
Quando ho aggiunto cache delle query, ho notato che durante la stessa sessione, Hibernate non ha colpito i tempi di database N più, solo una volta per sessione.
- Quindi la mia prima ipotesi è che Hibernate prima effettui ricerche nella Session Cache, quindi nella 2 ° Cache di livello. Questa supposizione è corretta?
- Suppongo anche che se l'oggetto() che non si trova nella cache di secondo livello, sia stato modificato nel database, la cache di query, in ambito incrociato, restituirà gli identificatori errati e quindi gli oggetti errati. È corretto?
- È quindi sicuro dire che l'utilizzo della cache di query per le query che includono informazioni immutabili anche per gli oggetti cache non 2L è una buona pratica? (Ad esempio una query che la sua clausola WHERE contiene una condizione che sarà sempre tornare gli stessi risultati, ad esempio, "selezionare p.ser_num dove p.id =?", Quando SER_NUM e id coppie non cambiano una volta creato)
By il modo in cui, nel relativo documento question, si afferma che la cache delle query non funziona sull'ambito della Session Cache. Sono in grado di capire che affermazione o qualcos'altro?
+1 per una domanda formata, formattata e ricercata in modo eccellente. –