0

我有一个问题,我在另一个问题中解决了,但这是一个更大的问题:

使用 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"
    }
}
}

这让我很生气,因为我尝试了所有类型的调整来启动文件(引导、数据源/休眠、配置等——我什至不记得我尝试过的每一种不同的东西)。

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

4

1 回答 1

3

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

可能查看这是否真的发生的最简单方法是只为休眠打开跟踪级别日志记录:

trace 'org.hibernate.SQL'

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

为了进行更多调查,我可能会查看打开hibernate 的 JMX Monitoring,然后连接jconsole到您正在运行的 grails 实例以深入了解已加载和未加载的详细信息。

于 2012-05-15T04:32:57.403 回答