【问题标题】:Is closing and reopening Realm instances bad for performance?关闭和重新打开 Realm 实例对性能不利吗?
【发布时间】:2016-04-05 14:29:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: java android persistence realm


    【解决方案1】:

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

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

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

    如果您关闭所有线程上的所有实例,您将有一个“冷启动”,这是最昂贵的,因为我们需要分配内存 + 进行架构验证。

    最佳做法是在线程存在期间保持 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 中完成?
    • 我们使用内存映射,但是是的,这是您第一次打开 Realm 时冷启动的一部分。
    猜你喜欢
    • 1970-01-01
    • 2020-10-26
    • 2011-01-27
    • 2015-09-07
    • 1970-01-01
    • 2018-03-25
    • 2010-11-04
    • 2022-10-19
    相关资源
    最近更新 更多