¿Es el cierre y la reapertura de las instancias de Realm malas para el rendimiento?

Cuando uso SQLite por lo general tienen una sola instancia de SQLiteOpenHelper por aplicación y nunca la cierro, ya que su base de datos es utilizada continuamente por muchas otras clases y cerrar / reabrir sería más lento y más complicado.

Ahora estoy jugando con Realm y estoy planeando acceder a instancias de Realm sólo desde Data Access Objects. Cada llamada se realizará desde un hilo de trabajo.

He estado leyendo los ejemplos y generalmente llaman getInstance / close por Actividad o tarea de fondo. Dado que Realm persiste los datos en un archivo como SQLite, ¿es una buena idea llamar a getInstance / close para cada operación? Quiero decir, sería llamar close realmente cerrar la conexión de archivo y por lo tanto hacer la siguiente llamada getInstance más lento? ¿Debo almacenar en caché una instancia de Realm en el nivel de aplicación e inyectarla en los DAO?

Realm utiliza una caché local de referencia de hilos contados + una validación de esquema optimizada. Esto significa que mientras tengas al menos una instancia abierta en un subproceso que llame a Realm.getInstance() , es solo una búsqueda de HashMap.

Si tiene una instancia abierta en cualquier subproceso, omitiremos la validación de esquema en otros subprocesos aunque sea la primera instancia abierta allí.

Si cierra todas las instancias en un hilo dado, liberaremos la memoria local del hilo y tendrá que ser reasignada para la siguiente instancia en ese hilo.

Si cierra todas las instancias en todos los subprocesos tendrá un "arranque en frío", que es el más caro ya que tenemos que asignar memoria + hacer una validación de esquema.

La mejor práctica es mantener la instancia de Realm abierta durante el tiempo que dure tu hilo. Para el hilo de UI que es más fácil de hacer utilizando el patrón descrito aquí: https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances

Para los subprocesos de trabajo que abren la instancia de Realm al principio y lo cierran al salir, sería el más óptimo:

 new Thread(new Runnable() { public void run() { Realm realm = Realm.getDefaultInstance(); doWork(realm); realm.close(); } }).start(); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.