关闭和重新打开 Realm 实例是否对性能不利?
Is closing and reopening Realm instances bad for performance?
在使用 SQLite 时,我通常每个应用程序都有一个 SQLiteOpenHelper 实例,而且我从不关闭它,因为它的数据库被许多其他 类 和 closing/reopening 连续使用,它会更慢而且更多复杂。
现在我正在研究 Realm,我打算只从数据访问对象访问 Realm 实例。每次调用都将从工作线程进行。
我一直在阅读示例,它们通常会在每个 Activity 或后台任务中调用 getInstance/close。由于 Realm 像 SQLite 一样将数据保存在文件中,因此为每个操作调用 getInstance/close 是个好主意吗?我的意思是,调用 close
实际上会关闭文件连接,从而使下一个 getInstance
调用变慢吗?我应该在应用程序级别缓存 Realm 实例并将其注入 DAO 吗?
Realm 使用引用计数线程本地缓存 + 优化模式验证。这意味着只要您在调用 Realm.getInstance()
的线程上至少打开了一个实例,它就只是一个 HashMap 查找。
如果您在 任何 线程上打开了一个实例,我们将跳过其他线程上的架构验证,即使它是在那里打开的第一个实例。
如果您关闭给定线程上的所有实例,我们将释放线程本地内存,并且需要为该线程上的下一个实例重新分配它。
如果您关闭所有线程上的所有实例,您将有一个 "cold boot" 这是最昂贵的,因为我们需要分配内存 + 进行架构验证。
最佳做法是在您的线程存在期间保持 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();
在使用 SQLite 时,我通常每个应用程序都有一个 SQLiteOpenHelper 实例,而且我从不关闭它,因为它的数据库被许多其他 类 和 closing/reopening 连续使用,它会更慢而且更多复杂。
现在我正在研究 Realm,我打算只从数据访问对象访问 Realm 实例。每次调用都将从工作线程进行。
我一直在阅读示例,它们通常会在每个 Activity 或后台任务中调用 getInstance/close。由于 Realm 像 SQLite 一样将数据保存在文件中,因此为每个操作调用 getInstance/close 是个好主意吗?我的意思是,调用 close
实际上会关闭文件连接,从而使下一个 getInstance
调用变慢吗?我应该在应用程序级别缓存 Realm 实例并将其注入 DAO 吗?
Realm 使用引用计数线程本地缓存 + 优化模式验证。这意味着只要您在调用 Realm.getInstance()
的线程上至少打开了一个实例,它就只是一个 HashMap 查找。
如果您在 任何 线程上打开了一个实例,我们将跳过其他线程上的架构验证,即使它是在那里打开的第一个实例。
如果您关闭给定线程上的所有实例,我们将释放线程本地内存,并且需要为该线程上的下一个实例重新分配它。
如果您关闭所有线程上的所有实例,您将有一个 "cold boot" 这是最昂贵的,因为我们需要分配内存 + 进行架构验证。
最佳做法是在您的线程存在期间保持 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();