Я использую Spring с Hibernate для создания корпоративного приложения.
Теперь, из-за абстракций, данных фреймворком для базового J2EE архитектура, очевидно, что производительность моего приложения снизится.
Что мне нужно знать, так это набор факторов, которые мне нужно учитывать, чтобы принять решение о минимальных характеристиках (скорость обработки + ОЗУ и т. д.), Которые мне нужны для одного хост-сервера приложения, работающего под RedHat Linux 3+ и предназначенного для запуска только это приложение, которое даст оценку эффективности, скажем, 8 из 10 при увеличении базы пользователей одновременного доступа на 100 в месяц.
Кластеризация не используется.
Я серьезно сомневаюсь, что использование Spring существенно повлияет на вашу производительность.
Какие именно аспекты Spring могут вызвать проблемы с производительностью?
Здесь так много переменных, что единственный ответ - «пососать и посмотреть», но с научной точки зрения.
Вам нужно создать сервер, чем это сделать. Начните с некоторой "стандартной" настройки, скажем, с 4-ядерным процессором и 2-гигабайтной оперативной памятью, затем запустите тестовый скрипт, чтобы увидеть, соответствует ли он вашим потребностям. (что, скорее всего, так и будет!).
Если это не так, вы сможете рассчитать требуемый размер сервера на основе нулевых значений, полученных в результате теста, или - устранить проблему с производительностью, чтобы сервер работал на имеющемся у вас оборудовании.
Важно определить, что ограничивает вашу производительность. Являетесь ли вы сервером, использующим все ядра, или ваши процессы застряли на одном ядре, ваша JVM получает достаточно памяти, привязаны ли вы к вводу-выводу или к базе данных.
Как только вы узнаете ограничивающие факторы, довольно легко найти решение - либо повысьте эффективность своих программ, либо купите больше подходящего оборудования.
С J2EE следует остерегаться двух вещей - большинство JVM имеют размеры кучи по умолчанию с последнего десятилетия, убедитесь, что ваша JVM имеет достаточно кучи и стека (по крайней мере, 1 Гб каждый!), - требуется время для всей JIT-компиляции, объект кеширование, загрузка модуля и т. д., чтобы успокоиться - проверьте свою систему как минимум в течение часа, прежде чем начинать тестирование.
В качестве инструментария я не вижу, чтобы Spring сам по себе влиял на производительность после инициализации, но я думаю, что Hibernate будет. Насколько велик этот эффект, зависит от множества деталей, таких как схема БД, и насколько реляционная компоновка отличается от уровня объектно-ориентированного проектирования и, конечно, от того, как организован доступ к БД и как часто происходит доступ к БД и т. д. Поэтому я сомневаюсь, что есть это практическое правило. Просто попробуйте разработать важные прототипы с использованием альтернативных серверов приложений или попробуйте собственную небольшую версию JDBC без использования ORM.
Какое снижение производительности? В отношении чего? Вы измеряли производительность перед использованием фреймворка?
Если среда Spring вызывает неприемлемые проблемы с производительностью, очевидным решением будет не использовать ее.
Я никогда не слышал, чтобы Spring каким-либо образом снижал производительность во время выполнения. Поскольку он использует в основном POJO, я был бы удивлен, если бы с ним что-то не так. Может быть, кроме разбора большого количества XML при запуске, но это решается с помощью аннотаций.
Просто сначала напишите свое приложение, а затем настройте его соответствующим образом.
Без обид, но я готов поспорить, что проблемы с производительностью, скорее всего, связаны с кодом вашего приложения, чем с Spring.
Если вы посмотрите, как они написали свой исходный код, вы увидите, что они уделяют большое внимание качеству.
Единственный способ узнать это - профилировать свое приложение, видеть, на что тратится время, анализировать, чтобы определить основную причину, исправить ее, промыть и повторить. Это наука. Все остальное - догадки.
Я использовал Spring в производственном приложении, которое работает без сбоев в течение трех лет, и это количество растет. Никаких утечек памяти, никаких потерянных соединений, никаких отказов сервера, никаких проблем с производительностью. Он просто бежит как масло.
Spring обычно используется для создания долгоживущих объектов вскоре после запуска приложения. Фактически нет затрат на производительность в течение всего срока службы.
Я предполагаю, что накладные расходы Hibernate (я не знаю внутреннего устройства, но может быть много отражений, генерации строк и поиска карт; в качестве альтернативы он мог бы включать генератор кода и компилятор), вероятно, затмевается на приличном процессоре из-за запрос базы данных туда и обратно.