Grails и Hibernate - множество доменных объектов с множеством свойств

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

В проекте Grails по умолчанию с использованием STS Spring/Hibernate находится под обложками. Когда приложение Grails загружается, моя база данных с более чем 100000 объектами домена кажется загруженной в память. Является ли это на уровне 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"
    }
}
}

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

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

1 ответ

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

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

trace 'org.hibernate.SQL'

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

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

Другие вопросы по тегам