¿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.
- Persistencia de objetos con Realm (error: Cambiar datos de Realm sólo se puede hacer desde dentro de una transacción)
- Migración de Realm de Android: Agregar nueva columna de lista de Realm
- Android Realm número de versión de migración basado en qué?
- Android Realm que almacena int y String
- Problemas de serialización de RealmList (Realm / Gson / Intent)
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?
- RETROFIT POST Objeto Realm
- La migración de Realm se está estrellando en Android 7.1.2
- Cómo manejar la migración de dominios si los usuarios omitir las actualizaciones
- Hacer que GSON & Realm juegue bien
- Realm: cambia el nombre del campo para la migración
- Modo correcto de hacer la migración de Realm
- ¿Qué clave principal se debe establecer en el db de Android local antes de sincronizarlo con el servidor?
- Migración en Realm 0.81.1
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();