【问题标题】:How to speed up eager loading of foreign collections?如何加快外国收藏的急切加载?
【发布时间】:2016-11-08 10:10:41
【问题描述】:

我有一个用 ORMlite 映射的数据库表,它包含一些数据(18 列),还包含ForeignCollectionField(eager = true)

问题是从这个表中加载所有数据时...... ORMlite 正在为每个项目创建查询,而不是使用连接。这会导致 67124 次查询,并且需要永远加载该表中的所有对象。

这可以在几秒钟内在右连接查询中完成吗?为什么要生成数千个查询?

如何加快速度?我是否必须编写原始查询然后 RawRowMapper ,这使得使用 ORM 毫无意义..

如何处理在 ormlite 中加载急切的集合?因为queryForAll不是办法..

【问题讨论】:

  • 为什么要加载所有数据以及如何加载? ORM 不适用于报告或 ETL,这是“加载所有数据”的唯一正当理由。为此使用存储过程或视图。您描述的是N+1 问题,应该通过使用急切加载来解决。您如何进行查询以及如何定义映射?
  • PS ORM 真的,真的 不适用于报告或 ETL。这只是学术讨论。当您打算对它们应用任何域逻辑时,将行和值转换为对象不会获得任何收益。
  • 在这种情况下,我需要加载所有数据,这些数据稍后将全部显示在3D图形中并用于模拟......这背后有很大的领域逻辑。这个表有更多的列,整个数据库有更多的表..但是这次我需要加载所有并且它很慢..无论如何即使不会有大的域逻辑并且你在开始时加载所有数据,数据库仍然是个好方法保存这些数据,因为它的列可以在运行时更新,而不是重写整个 xml 文件..

标签: java performance sqlite ormlite foreign-collection


【解决方案1】:

问题是从这个表中加载所有数据时...... ORMlite 正在为每个项目创建查询,而不是使用连接。这会导致 67124 次查询,并且需要永远加载该表中的所有对象。

它是 ORM_Lite_ 是有原因的。很多人要求加入支持外国收藏,但我还没有得到它。这并不容易。

如果您仍想使用 ORMLite,那么我建议 使用 eager = true 并改为执行 2 次查询。一个查询主要项目,然后另一个查询使用与集合实体关联的 DAO,使用 IN。比如:

qb = accountDao.queryBuilder();
qb.where()...;
List<Account> accounts = qb.query();

// build a list of account-ids
List<Long> accountIds = new ArrayList<>();
for (Account account : accounts) {
    accountIds.add(account.getId());
}

// now use this list of ids to get your other entities
List<Order> orders = orderDao.queryBuilder().where().in("accountId", accountIds).query();
// now you have a list of orders for all of your ids
// you will need to associate each order with its account

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多