首页 > 解决方案 > 对象框 DbMaxReadersExceededException

问题描述

ObjectBox 版本 2.7.1,MaxNumReaders 500,@Entity 计数超过 50,一些实体有超过 100K 行。发布两周后,我们开始在 Sentry 中遇到错误:无法开始读取事务(已达到最大读取事务) 如何使用调试器在早期阶段诊断问题?

标签: objectbox

解决方案


当您遇到 DbMaxReadersExceededException 时,通常可以通过检查以下选项来解决问题:

  1. 因为您已经增加了最大读者值,所以我假设您使用多个线程。我要做的第一件事是验证您的线程逻辑。我们已经看到应用程序无限制地产生线程并因此破坏读者的情况。访问 ObjectBox DB 时,每个线程都需要一个阅读器。因此,获得 DbMaxReadersExceededException 可能是线程代码中出现问题的征兆。

  2. 如果你有很多短期线程,你可能会看到类似“W/Box: Skipping low-level close for read-only cursor (non-creator thread)”或“Hint: use closeThreadResources() to avoid finalizing recycle交易”。后一个提示正是您在线程退出之前应该做的事情。如果你只使用了一个或两个Boxes,你可以调用 box: 上的方法box.closeThreadResources(),否则 BoxStore 还提供了一个同名的方法来为所有的 Box 做这个。

  3. 目前还有一个与未绑定线程池相关的未解决问题。如果遇到这种情况,当前的解决方法是使用具有上限的线程池。


推荐阅读