2016-04-05 36 views
7

Quando si utilizza SQLite solito ho una singola istanza SQLiteOpenHelper per ogni applicazione e non ho mai mai chiuderlo, dal momento che il suo database è usato continuamente da molte altre classi e la chiusura/riapertura sarebbe più lento e più complicato.La chiusura e la riapertura delle istanze di Realm sono errate per le prestazioni?

Ora sto giocando con Realm e sto pianificando di accedere alle istanze di Realm solo da oggetti di accesso ai dati. Ogni chiamata verrà effettuata da un thread di lavoro.

Ho letto gli esempi e di solito chiamano getInstance/chiudi per attività o attività in background. Poiché Realm persiste i dati in un file come SQLite, è una buona idea chiamare getInstance/close per ogni operazione? Voglio dire, chiamerei close effettivamente chiudere la connessione al file e quindi rendere più lenta la successiva chiamata getInstance? Devo memorizzare nella cache un'istanza di Realm a livello di applicazione e invece inserirla nei DAO?

risposta

18

Regno utilizza un riferimento contato filo cache locale + convalida dello schema ottimizzato. Significa che finché hai almeno un'istanza aperta su un thread che chiama Realm.getInstance() è solo una ricerca HashMap.

Se si dispone di un caso aperto su qualsiasi filo, saltiamo la convalida dello schema su altri thread anche se è la prima istanza aperto lì.

Se si chiudono tutte le istanze su una determinata discussione, la memoria locale del thread verrà liberata e sarà necessario riallocarla per l'istanza successiva su quel thread.

Se si chiudono tutte le istanze su tutti i thread, si avrà un "avvio a freddo" che è il più costoso in quanto è necessario allocare memoria + effettuare una convalida dello schema.

Si consiglia di mantenere l'istanza di Realm aperta per tutto il tempo in cui il thread è attivo. Per il thread UI che è più facile fatto usando il modello descritto qui: https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances

per thread di apertura l'istanza regno all'inizio e chiusura quando esce sarebbe il più ottimale:

new Thread(new Runnable() { 
    public void run() { 
    Realm realm = Realm.getDefaultInstance(); 
    doWork(realm); 
    realm.close(); 
    } 
}).start(); 
+0

diretta dalla sorgente ! Grazie per la risposta. Ma che dire del collegamento al file e inizializzarlo/analizzarlo? È fatto nel primo 'getInstance' dopo un avvio a freddo? –

+0

Utilizziamo la mappatura della memoria, ma sì, fa parte dell'avvio a freddo quando apri il dominio per la prima volta. –