关闭和重新打开Realm实例会影响性能吗?

8
当使用SQLite时,我通常每个应用程序只有一个SQLiteOpenHelper实例,并且从不关闭它,因为其数据库被许多其他类连续使用,关闭/重新打开会更慢且更复杂。
现在我正在考虑使用Realm,并计划仅从数据访问对象中访问Realm实例。每个调用都将在工作线程中进行。
我一直在阅读示例,它们通常每个Activity或后台任务调用getInstance/close。由于Realm像SQLite一样将数据持久化到文件中,因此每个操作调用getInstance/close是个好主意吗?我的意思是,调用close是否会真正关闭文件连接,从而导致下一个getInstance调用变慢?我应该在应用程序级别缓存Realm实例并将其注入DAO中吗?
1个回答

23

Realm使用引用计数线程局部缓存和优化的模式验证。这意味着只要您在调用Realm.getInstance()的线程上至少打开了一个实例,它就只是一个HashMap查找。

如果您在任何线程上打开了一个实例,我们将跳过其他线程上的模式验证,即使它是在那里打开的第一个实例。

如果您在给定的线程上关闭了所有实例,我们将释放线程本地内存,下一个该线程上的实例需要重新分配内存。

如果您在所有线程上关闭了所有实例,则会出现“冷启动”,这是最昂贵的,因为我们需要分配内存+执行模式验证。

最佳实践是尽可能长时间地保持Realm实例的打开状态。对于UI线程,可以使用此处描述的模式轻松完成:https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances

对于工作线程,最优的方法是在开始时打开Realm实例,并在退出时关闭它:

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

直接从源头开始!感谢您的回复。但是如何连接到文件并初始化/解析它呢?这是在冷启动后的第一个getInstance中完成吗? - Mister Smith
我们使用内存映射,但是是的,在您第一次打开 Realm 时,这是冷启动的一部分。 - Christian Melchior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接