Grails和Hibernate—许多具有许多属性的域对象
我在另一个问题中解决了一个问题,但这是一个更大的问题: 使用STS的默认Grails项目有Spring/Hibernate。当Grails应用程序加载时,我的100000多个域对象的数据库似乎加载到内存中。我不知道这是否在Hibrate/ORM层Grails和Hibernate—许多具有许多属性的域对象,hibernate,grails,sts-springsourcetoolsuite,Hibernate,Grails,Sts Springsourcetoolsuite,我在另一个问题中解决了一个问题,但这是一个更大的问题: 使用STS的默认Grails项目有Spring/Hibernate。当Grails应用程序加载时,我的100000多个域对象的数据库似乎加载到内存中。我不知道这是否在Hibrate/ORM层 Pre DB domain object load (400 MB start up) Post DB domain object load (900 MB start up) 这没有任何引导数据。没有现成的应用程序性能。只是一个干净的启动和我的域对
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、配置等等,我甚至记不起我尝试过的每一件事)
*编辑*
我没有对我的对象使用即时抓取。只是默认的懒惰。你是如何得到你的前/后内存号的?在我看来,除非你的BootStrap.groovy文件中有一个非常奇怪的插件或其他东西,否则你的整个域对象集都不会加载到内存中 要想知道这是否真的发生了,最简单的方法可能是打开hibernate的跟踪级别日志记录:
trace 'org.hibernate.SQL'
如果它真的从数据库中加载了所有的内存,那么当应用程序启动时,你会看到大量的SQL查询
为了进一步研究,我可能会先打开,然后将
jconsole
连接到正在运行的grails实例,以深入了解加载的内容和未加载的内容的详细信息。如何获取前/后内存号?在我看来,除非你的BootStrap.groovy文件中有一个非常奇怪的插件或其他东西,否则你的整个域对象集都不会加载到内存中
要想知道这是否真的发生了,最简单的方法可能是打开hibernate的跟踪级别日志记录:
trace 'org.hibernate.SQL'
如果它真的从数据库中加载了所有的内存,那么当应用程序启动时,你会看到大量的SQL查询
为了进一步研究,我可能会考虑启用,然后将
jconsole
连接到正在运行的grails实例,以深入了解加载内容和未加载内容的详细信息。使用SQL跟踪的好提示!关于痕迹的绝妙提示。我会尝试一下。使用SQL跟踪的好提示!关于痕迹的绝妙提示。我试试看。