Подтвердить что ты не робот

Каков наилучший способ профилировать контейнер spring, чтобы узнать, как оптимизировать время его запуска?

У меня есть приложение, которое становится довольно большим, а время запуска Spring составляет около 20 секунд. Для использования в производстве это прекрасно, но для развития это большая боль.

Что такое хороший инструмент для профилирования или подход, который может дать мне именно ту информацию, которая мне нужна, чтобы выяснить, что так долго? Может быть, это то, что я могу оптимизировать?

Мое приложение - довольно типичное веб-приложение spring/hibernate. Там около 50 таблиц базы данных и несколько сотен beans (например, 200-300... я не считал). Там несколько @Configurable beans. Много компонентного сканирования. Я также использую Spring Безопасность.

Я сделал некоторое профилирование профилирования с log4j - только в настройке INFO. Вот некоторые из вещей, которые занимают немного времени:

  • INFO DefaultListableBeanFactory: 555 - Предварительные экземпляры синглонов - 2 секунды
  • INFO SessionFactoryImpl: 202 - сессия сборки factory - 2 секунды
  • INFO HibernateTransactionManager: 415 - Использование DataSource [com.mchange.v2.c3p0.ComboPooledDataSource......] Hibernate SessionFactory для HibernateTransactionManager - 7 секунд

Есть несколько вещей, которые занимают от 0,5 до 1 секунды, но эти 3 были самыми большими.

4b9b3361

Ответ 1

Вы также можете использовать Spring.

Ответ 2

Один из вариантов, который вы можете попробовать, - использовать параметр по умолчанию-lazy-init для ленивой инициализации beans. Spring инициализирует всю область с единым диапазоном beans во время инициализации. Прочтите Lazily-созданный beans раздел справочный документ.

Обязательно настройте значение параметра так, чтобы вы могли изменить его на true во время dev и false во время производственного развертывания.

Сканирование компонентов медленное. Обратитесь к этому сообщению о том, как отключить это при использовании Autowiring.

Ответ 3

Я опечален тем, что до сих пор все ответы сосредоточены на том, как повысить производительность, и ни один из них на самом деле не поможет вам провести анализ. Я использовал YourKit для отличного эффекта в других проблемах профилирования, но не могу говорить о его полезности при запуске Spring.

У меня был хороший успех, разбивая мою конфигурацию Spring на отдельные файлы и загружая только файлы, необходимые для конкретного теста. Это работает особенно хорошо для меня, потому что я использую Camel, который дорого запускается и не используется большинством моих тестов. Я использовал H2, чтобы я мог запускать тесты своих DAOs + Services с базой данных без какого-либо сложного запуска/выключения (хотя это потребовалось некоторое время, чтобы получить все, что было связано вместе). Тем не менее, у меня все еще есть проблема с запуском всего приложения для интерактивного тестирования. Это слишком медленно для меня.

Ответ 4

20 секунд, чтобы запустить приложение. это не имеет значения. Какое значение имеет время, необходимое для запуска ваших тестовых случаев!

  • Итак, напишите ваши тесты с помощью Mocks, которые вообще не нужны для запуска spring.
  • Для большей интеграции, такой как тесты, попробуйте разделить конфигурацию, так что инициализируются только beans, которые необходимы для некоторой группы тестов.