Grails和Hibernate - 许多具有大量属性的域对象

时间:2012-05-15 00:46:09

标签: hibernate grails sts-springsourcetoolsuite

我在另一个问题中遇到了问题,但这是一个更大的问题:

使用STS的默认Grails项目包含Spring / Hibernate。当Grails应用程序加载时,我的100,000多个域对象的数据库似乎被加载到内存中。无论这是否在Hiberate / ORM层,我都不知道。

Pre DB domain object load (400 MB start up)
Post DB domain object load (900 MB start up)

这没有任何启动数据。没有应用程序性能开箱即用。只是一个干净的启动和我的域对象。

我可以使用显示器,但我得到了相同的答案。这似乎是配置。如何在Grails中设置Hibernate以不将这些对象加载到内存中?

这是datasource.groovy文件:

dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
username = "xxx"
password = "xxx"
}
hibernate {
cache.use_second_level_cache = false
cache.use_query_cache = true
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/mydb"
    }
}
test {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/mydb"
    }
}
production {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://localhost/mydb"
    }
}
}

这让我很伤心,因为我尝试了所有类型的调整来启动文件(启动带,数据源/休眠,配置等等 - 我甚至无法回想起我尝试的每一件事)。

*编辑* 我没有使用我的对象渴望获取。只是默认懒惰。

1 个答案:

答案 0 :(得分:3)

你如何得到你的前/后记忆号码?除非你的BootStrap.groovy文件中有一个非常奇怪的插件或额外的东西,否则我觉得你的整个域对象集都没有被加载到内存中。

可能最简单的方法是查看是否真的发生这种情况,只需打开hibernate的跟踪级别日志记录:

trace 'org.hibernate.SQL'

如果它真的从数据库中加载了内存中的所有内容,那么当应用程序启动时,您会看到大量的SQL查询。

要进行更多调查,我可能会考虑启用JMX Monitoring of hibernate,然后将jconsole连接到正在运行的grails实例,以深入了解已加载和未加载的内容的详细信息。