【问题标题】:Grails and Hibernate - Lots of domain objects with lots of propertiesGrails 和 Hibernate - 大量具有大量属性的域对象
【发布时间】:2012-05-22 11:58:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: hibernate grails sts-springsourcetoolsuite


    【解决方案1】:

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

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

    trace 'org.hibernate.SQL'
    

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

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

    【讨论】:

    • 使用 SQL 跟踪的好提示!
    • 关于跟踪的优秀提示。我会试试看。
    猜你喜欢
    • 2018-07-29
    • 2020-03-09
    • 2013-07-08
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多