【问题标题】:Memory usage of Grails GORM methodsGrails GORM 方法的内存使用情况
【发布时间】:2013-03-25 12:06:58
【问题描述】:

我想知道 grails 如何通过 GORM 方法处理内存使用和加载(获取)域对象,例如:

findAllWhere
findAllBy
list
...
  • 它们是否已完全加载(分别是它们的代理)到内存中?
  • 如果我用each/every/any 遍历它们,它们是否由一个迭代器支持,以便懒惰地加载它们?
  • 我应该更喜欢 createCriteria() {...}.scroll() 以获得更好的内存使用率吗?

【问题讨论】:

  • 你使用哪个数据库来支持 GORM?
  • 假设是预打包的 db 的 HSQL 或 H2。但我希望 GORM 不依赖于 db...
  • 好吧,它不能独立,因为它必须使用 DB 驱动程序来连接不同的 DB。例如,GORM 使用 Mongo Java 驱动与 MongoDB 交互,使用 Jedis 与 Redis 交互。除此之外,您还拥有 Spring Data 框架。

标签: grails grails-orm


【解决方案1】:

假设我们忽略 GORM 使用的每种类型的 DB 驱动程序的不同行为,我们可以在代码和文档中找到答案。

动态查找器由org.grails.datastore.gorm.GormStaticApiorg.grails.datastore.gorm.finders 包中的查找器类提供给域类。

查看这些类,我们可以看到返回多个结果的查询总是组装为DetachedCriteria 并且总是调用criteria.list() 方法;这意味着整个结果批次被组装并保存在内存中。使用 Groovy 的集合方法遍历结果不会有任何区别,因为您实际上是在返回的结果列表中调用这些方法。

关于“加载了多少结果域?”这个问题 - 这取决于域的组成,但您可以假设加载了域的 字段 并且任何关联默认都是惰性的

在需要更好内存使用的场景中,您当然可以结合结果预测自行编写标准并使用scroll(请注意,此功能取决于数据库的类型)。

在极端情况下,我什至会绕过 GORM,直接使用 DB 驱动程序。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2014-05-11
    • 2012-02-21
    • 2014-08-03
    • 2016-10-02
    • 2013-03-10
    • 2010-09-22
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多