So che mybatis ha cache e si svuoteràcache quando si esegue l'aggiornamento per impostazione predefinita. Quindi scarica la cache quando si seleziona select ... per l'aggiornamento? Se la risposta è no, allora se eseguo select in un primo momento e immediatamente seguito da execute select ... per l'aggiornamento, mybatis accederà al database o colpirà la cache?
risposte:
0 per risposta № 1il comportamento predefinito di svuotamento della cache non è correlato all'SQL effettivamente eseguito, ma al tipo di Mybatis dichiarazione eseguita.
Qualunque sia l'SQL in <select>
o @Select
allora mentre flushCache
la proprietà non è specificata (in @Options
per lo stile di annotazione), si applica il comportamento predefinito: no flush. e per <update>
o @Update
la cache viene svuotata per impostazione predefinita.
Comunque nel tuo caso, il SELECT
e SELECT FOR UPDATE
sono diverse stringhe SQL, quindi quando si chiamaentrambi, il database verrà colpito per entrambi, anche se il set di risultati è lo stesso, la cache associa le stringhe SQL e i parametri al risultato. Cambia stringa SQL => nuovo hit, modifica parametri => nuovo hit. Se una dichiarazione <select id=stmt1>
e un'altra affermazione <select id=stmt2>
produce la stessa stringa SQL e viene chiamata constessi valori dei parametri, durante la stessa sessione e non si verificano operazioni di flushing tra di loro, quindi la seconda chiamata dovrebbe colpire la cache. Questo può essere verificato abilitando i log di debug sul pacchetto mapper.namespace.
La cache non funziona come in ORM (Hibernate ..): cache a cui fa riferimento il tipo di entità e la chiave primaria.
La cache dura al massimo fino alla fine della sessione.
È conveniente quando si richiedono gli stessi datiripetutamente (stessa istruzione / parametri) durante una sessione, non è necessario memorizzare i risultati per l'utilizzo successivo, basta richiamare l'istruzione nuovamente, la cache salverà semplicemente un accesso al DB per il risultato.