Grails и Hibernate — множество объектов предметной области с большим количеством свойств

У меня есть проблема, которую я затронул в другом вопросе, но это более крупный вопрос:

В проекте Grails по умолчанию, использующем STS, есть 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)

Это без каких-либо данных загрузочного ремня. Нет производительности приложения из коробки. Просто чистый запуск и мои объекты домена.

Я могу использовать мониторы, но получаю те же ответы. Похоже, это конфигурация. Как настроить Hibernate в Grails, чтобы эти объекты не загружались в память?

Это файл 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"
    }
}
}

Это убивает меня, потому что я пробовал все типы настроек для запуска файлов (загрузочная планка, источник данных / спящий режим, конфигурация и т. Д. - я даже не могу вспомнить все, что я пробовал).

* Изменить * Я не использую активную выборку для своих объектов. Просто лень по умолчанию.


person user82302124    schedule 15.05.2012    source источник


Ответы (1)


Как вы получаете свои номера до/после памяти? Мне не кажется вероятным, что весь ваш набор объектов домена загружается в память, если только у вас нет очень странного плагина или чего-то еще в вашем файле BootStrap.groovy.

Вероятно, самый простой способ проверить, действительно ли это происходит, — просто включить ведение журнала уровня трассировки для режима гибернации:

trace 'org.hibernate.SQL'

Если он действительно загружает все это в память из БД, вы увидите огромное количество SQL-запросов, выполняемых при запуске приложения.

Чтобы узнать больше, я бы, вероятно, включил JMX-мониторинг спящего режима, а затем подключите jconsole к работающему экземпляру Grails, чтобы изучить подробности того, что загружено, а что нет.

person Ted Naleid    schedule 15.05.2012
comment
отличный совет по использованию трассировки SQL! - person Luis Muñiz; 15.05.2012
comment
Отличный совет про след. Я попробую это. - person user82302124; 15.05.2012