关闭和重新打开Realm实例是否对性能不利



使用SQLite时,我通常每个应用程序都有一个SQLiteOpenHelper实例,而且我从未关闭过它,因为它的数据库被许多其他类持续使用,关闭/重新打开它会更慢、更复杂。

现在我在玩Realm,我计划只从数据访问对象访问Realm实例。每个调用都将从工作线程进行。

我一直在阅读这些例子,它们通常会调用getInstance/closep-Activity或后台任务。由于Realm将数据保存在类似SQLite的文件中,因此为每个操作调用getInstance/close是个好主意吗?我的意思是,调用close实际上会关闭文件连接,从而使下一个getInstance调用更慢吗?我应该在应用程序级别缓存Realm实例并将其注入DAO吗?

Realm使用引用计数线程本地缓存+优化的架构验证。这意味着,只要在调用Realm.getInstance()的线程上至少打开一个实例,它就只是一个HashMap查找。

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

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

如果关闭所有线程上的所有实例,则会出现"冷启动",这是最昂贵的,因为我们需要分配内存+进行架构验证。

最佳实践是在线程存在的时间内保持Realm实例的打开状态。对于使用此处描述的模式最容易完成的UI线程:https://realm.io/docs/java/latest/#controlling-领域实例的生命周期

对于工作线程来说,在开始时打开Realm实例并在退出时关闭它将是最理想的:

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