对象框 DbMaxReadersExceededException
objectbox DbMaxReadersExceededException
ObjectBox 版本 2.7.1,
MaxNumReaders 500,
@Entity 计数超过 50,
一些实体有超过 10 万行。
发布两周后,我们开始在 Sentry 中收到错误:无法开始读取事务(已达到读取事务的最大值)
如何使用调试器在早期诊断问题?
当您遇到 DbMaxReadersExceededException 时,您通常可以通过检查这些选项来解决问题:
因为您已经增加了最大 readers 值,我假设您使用了多线程。我要做的第一件事是 验证您的线程逻辑 。我们已经看到应用程序无限制地生成线程并因此破坏 readers 的情况。每个线程在访问 ObjectBox DB 时都需要一个 reader。因此,获得 DbMaxReadersExceededException 可能是您的线程代码出现问题的征兆。
如果您有很多 短期线程 ,您可能会看到类似“W/Box 的日志:跳过低级关闭以进行读取-only 游标(非创建者线程)”或“提示:使用 closeThreadResources() 来避免完成回收事务”。后一个提示正是您在线程退出之前应该做的事情。如果你只使用了一个或两个Box
es,你可以调用盒子上的方法:box.closeThreadResources()
,否则BoxStore还提供了一个同名的方法来为所有盒子做这个。
目前还有 an open issue 与未绑定线程池相关。如果您 运行 这样做,当前的解决方法是使用具有上限的线程池。
ObjectBox 版本 2.7.1, MaxNumReaders 500, @Entity 计数超过 50, 一些实体有超过 10 万行。 发布两周后,我们开始在 Sentry 中收到错误:无法开始读取事务(已达到读取事务的最大值) 如何使用调试器在早期诊断问题?
当您遇到 DbMaxReadersExceededException 时,您通常可以通过检查这些选项来解决问题:
因为您已经增加了最大 readers 值,我假设您使用了多线程。我要做的第一件事是 验证您的线程逻辑 。我们已经看到应用程序无限制地生成线程并因此破坏 readers 的情况。每个线程在访问 ObjectBox DB 时都需要一个 reader。因此,获得 DbMaxReadersExceededException 可能是您的线程代码出现问题的征兆。
如果您有很多 短期线程 ,您可能会看到类似“W/Box 的日志:跳过低级关闭以进行读取-only 游标(非创建者线程)”或“提示:使用 closeThreadResources() 来避免完成回收事务”。后一个提示正是您在线程退出之前应该做的事情。如果你只使用了一个或两个
Box
es,你可以调用盒子上的方法:box.closeThreadResources()
,否则BoxStore还提供了一个同名的方法来为所有盒子做这个。目前还有 an open issue 与未绑定线程池相关。如果您 运行 这样做,当前的解决方法是使用具有上限的线程池。