Scopo
Indica alla shell nativa se occorre attivare la cache delle query.
Nella versione iOS9 del sistema operativo utilizzato dai dispositivi Apple è stato rimosso il supporto per i database SQLite. Pertanto, poter utilizzare i database SQLite in applicazioni offline prodotte con Instant Developer, è stato necessario fare in modo che la shell nativa si occupasse di operare sui vari database utilizzati dall'applicazione.
Pertanto, a partire dalla versione 14.0, le applicazioni offline, su dispositivi iOS 9 e successivi, utilizzano la shell nativa per operare sui database SQLite.
Tale modalità risulta più lenta delle versioni precedenti poiché ogni query deve essere inviata, tramite un apposito messaggio sincrono, alla shell nativa che la esegue sul database richiesto ed invia la risposta all'applicazione che la utilizza. Tale scambio di messaggi può richiedere anche 10ms su un iPad2. Pertanto, a partire dalla versione 14.0 di Instant Developer, è stata aggiunta una cache delle query che permette di ridurre, ove possibile, il numero di messaggi inviati alla shell nativa durante l'esecuzione delle query.
Il funzionamento è il seguente: ogni volta che l'applicazione esegue una query, il sistema decide se inserirla in una cache che viene poi gestita e svuotata nei seguenti casi:
- quando la connessione al dataabse viene chiusa
- quando il numero di query presenti in cache è superiore a 100
- se è stata aperta una transazione, ogni volta che la transazione viene chiusa
- se ci sono stati errori durante una transazione e viene effettuato un rollback della stessa
N.B.: le query di SELECT non vengono mai inserite in cache.
Quando il sistema decide di svuotare la cache invia un unico messaggio alla shell nativa che contiene tutte le query presenti in cache. La shell nativa esegue tutte le query singolarmente e, se si presentano errori durante l'esecuzione di una delle query, informa l'applicazione web segnalando l'errore. In questo modo, per esempio, se si eseguono 1000 inserimenti su database:
- se non è attiva la cache vengono inviati 1000 messaggi sincroni alla shell nativa. Questo, su dispositivi un po' datati, potrebbe richiedere più tempo per inviare e ricevere i messaggi che non per eseguire fisicamente le query sul database;
- se è attiva la cache vengono inviati 10 messaggi contenenti ciascuno 100 query. In questo caso l'overhead richiesto per la comunicazione scende a 100 ms.
La proprietà
CacheQueries ha 3 possibili valori (elencati nella lista valori
CacheQueriesValues):
- None: indica al sistema che la cache delle query non è attiva. Pertanto l'esecuzione di ogni query comporta l'invio di un messaggio sincrono alla shell nativa, che esegue la query ed invia la risposta all'applicazione. Normalmente tale modalità viene attivata se si desidera che ogni query venga eseguita immediatamente.
- Partial: indica al sistema che la cache delle query è attiva. In questa modalità il sistema svuota la cache (ed esegue le query contenute nella cache se presenti) anche prima di ogni istruzione SELECT. Questa modalità (che è quella predefinita) è più sicura in quando fa sì che tutte le query di aggiornamento, inserimento, cancellazione vengano inserite in cache mentre le istruzioni di lettura causino lo svuotamento della cache PRIMA che la lettura venga effettuata.
- Full: indica al sistema che la cache delle query è attiva. A differenza della modalità Partial il sistema non svuota la cache prima delle istruzioni di SELECT. Normalmente questa modalità viene attivata solo se si è sicuri che le istruzioni di SELECT non leggano gli stessi dati che le istruzioni di INSERT/UPDATE/DELETE modificano. Per esempio se si aggiorna un documento Categorie e nell'evento AfterSave si legge e si aggiorna un documento Prodotti la SELECT può essere eseguita anche se l'aggiornamento di Categorie non è stato effettuato. In questo caso il sistema esegue le seguenti operazioni:
- la query di aggiornamento di Categorie viene inserita in cache
- la query di lettura di Prodotti viene eseguita immediatamente senza che la cache venga toccata
- la query di aggiornamento di Prodotti viene inserita in cache
Quando la connessione al database viene chiusa, o la transazione viene committata, il sistema esegue le due query di UPDATE.
Questa modalità causa problemi se si desidera rileggere il valore di un contatore dopo aver eseguito un'istruzione di INSERT. Inoltre causa problemi se si inserisce un record, lo si rilegge tramite un ciclo For-Each-Row per caricare un BLOB. Dato che l'istruzione di insert viene inserita in cache e la query di select del For-Each-Row non ne causa lo svuotamento, il For-Each-Row non verrà eseguito poiché la query non restituisce righe.
Il valore predefinito della proprietà è
Partial. La modalità
Full può essere attivata in alcuni casi per rendere ancora più veloce l'esecuzione delle query.
Si consiglia di utilizzare il valore
None solo se il codice dell’applicazione non funziona correttamente quando è attiva la modalità
Partial.
Database.CacheQueries := Partial