我在另一个问题中遇到了问题,但这是一个更大的问题:
使用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"
}
}
}
这让我很伤心,因为我尝试了所有类型的调整来启动文件(启动带,数据源/休眠,配置等等 - 我甚至无法回想起我尝试的每一件事)。
*编辑* 我没有使用我的对象渴望获取。只是默认懒惰。
答案 0 :(得分:3)
你如何得到你的前/后记忆号码?除非你的BootStrap.groovy文件中有一个非常奇怪的插件或额外的东西,否则我觉得你的整个域对象集都没有被加载到内存中。
可能最简单的方法是查看是否真的发生这种情况,只需打开hibernate的跟踪级别日志记录:
trace 'org.hibernate.SQL'
如果它真的从数据库中加载了内存中的所有内容,那么当应用程序启动时,您会看到大量的SQL查询。
要进行更多调查,我可能会考虑启用JMX Monitoring of hibernate,然后将jconsole
连接到正在运行的grails实例,以深入了解已加载和未加载的内容的详细信息。