Часто ли вы получаете жалобы от клиентов на низкую скорость ответа JSP-страниц? Задумывались ли вы когда-нибудь о том, как ваше WEB-приложение сможет выдержать растущее количество посещений, когда количество посещений клиентов резко возрастает? В этой статье описаны некоторые очень практичные методы настройки JSP и сервлетов, которые могут сделать ваши сервлеты и страницы JSP более отзывчивыми и масштабируемыми. Более того, по мере увеличения количества пользователей загрузка системы будет иметь плавную тенденцию к росту. В этой статье я буду использовать несколько практических примеров и методов настройки, чтобы неожиданно повысить производительность вашего приложения. Некоторые из этих методов настройки применяются в вашей работе по программированию. Другие технологии связаны с настройкой сервера приложений. В этой статье мы подробно опишем, как улучшить общую производительность вашего приложения путем настройки сервлетов и страниц JSP. Предполагается, что перед прочтением этой статьи вы обладаете базовыми знаниями о сервлетах и JSP.
Метод 1. Кэшируйте данные в методе init() сервлета.
После того как сервер приложений инициализирует экземпляр сервлета и перед обработкой клиентских запросов, он вызывает метод init() сервлета. В жизненном цикле сервлета метод init() будет вызываться только один раз. Кэшируя некоторые статические данные в методе init() или выполняя некоторые трудоемкие операции, которые необходимо выполнить только один раз, можно значительно повысить производительность системы.
Например, лучшим примером является создание пула соединений JDBC в методе init(). Предположим, мы используем интерфейс DataSource jdbc2.0 для получения соединения с базой данных. В обычных обстоятельствах нам необходимо получить определенные данные через источник JNDI. Можно представить, что в конкретном приложении, если для каждого SQL-запроса будет выполняться JNDI-запрос, производительность системы резко упадет. Решением является следующий код, который кэширует источник данных, чтобы его можно было использовать во время следующего вызова SQL:
открытый класс ControllerServlet расширяет HttpServlet.
{
частный javax.sql.DataSource testDS = null;
public void init (конфигурация ServletConfig) выдает ServletException
{
super.init(конфигурация);
Контекст ctx = ноль;
пытаться
{
ctx = новый InitialContext();
testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}
catch (NamingException ne)
{
ne.printStackTrace();
}
поймать (Исключение е)
{
е.printStackTrace();
}
}
Публичный javax.sql.DataSource getTestDS()
{
вернуть testDS;
}
...
...
}
Способ 2: Отключить автоматическую перезагрузку сервлета и JSP (автоматическая перезагрузка)
Servlet/JSP предоставляет практическую технологию, а именно технологию автоматической перезагрузки, которая предоставляет разработчикам хорошую среду разработки при изменении сервлета и страницы JSP без необходимости перезапуска приложения. сервер. Однако эта технология представляет собой огромную потерю системных ресурсов на этапе запуска продукта, поскольку она принесет огромную нагрузку на загрузчик классов движка JSP. Поэтому отключение функции автоматической перезагрузки является отличным подспорьем для повышения производительности системы.
Способ 3. Не злоупотребляйте HttpSession.
Во многих приложениях нашей программе необходимо поддерживать состояние клиента, чтобы страницы могли взаимодействовать друг с другом. Но, к сожалению, поскольку HTTP по своей сути не имеет состояния, он не может сохранять состояние клиента. Поэтому обычные серверы приложений предоставляют сеансы для сохранения состояния клиента. В сервере приложений JSP функция сеанса реализована через объект HttpSession, но хоть это и удобно, но в то же время наносит большую нагрузку на систему. Потому что каждый раз, когда вы получаете или обновляете сеанс, системному оператору приходится выполнять трудоемкие операции сериализации. Вы можете повысить производительность системы, обрабатывая HttpSession следующими способами:
· Если в этом нет необходимости, вам следует отключить настройки по умолчанию для HttpSession на странице JSP: Если вы не укажете это явно, каждая страница JSP по умолчанию будет создавать HttpSession. . Если вам не нужно использовать сеанс в JSP, вы можете отключить его с помощью следующего индикатора страницы JSP:
<%@page session="false"%>
· Не храните большие объекты данных в HttpSession: Если вы используете большой объем данных объект хранится в HttpSession, сервер приложений будет сериализовать его каждый раз, когда он читается или записывается, тем самым добавляя дополнительную нагрузку на систему. Чем больше объект данных, который вы храните в HttpSession, тем быстрее снижается производительность системы.
· Если сеанс HttpSession вам больше не нужен, освободите его как можно скорее: если сеанс вам больше не нужен, вы можете освободить его, вызвав метод HttpSession.invalidate().
· Постарайтесь установить тайм-аут сеанса как можно короче: на сервере приложений JSP существует тайм-аут сеанса по умолчанию. Если по истечении этого времени клиент не выполнит никаких операций, система автоматически освободит соответствующий сеанс из памяти. Чем больше установлен тайм-аут, тем ниже будет производительность системы, поэтому лучший способ — попытаться сохранить его значение как можно меньшим.
Способ 4. Сжатие вывода страницы
— хороший способ решить проблему избыточности данных, особенно сегодня, когда пропускная способность сети недостаточно развита. Некоторые браузеры поддерживают gzip (GNU zip) для сжатия файлов HTML. Этот метод может значительно сократить время загрузки файлов HTML. Поэтому, если вы сожмете HTML-страницу, созданную сервлетом или JSP-страницей, пользователь почувствует, что скорость просмотра страницы будет очень высокой. К сожалению, не все браузеры поддерживают сжатие gzip, но вы можете проверить в своей программе, поддерживает ли его браузер клиента. Ниже приведен фрагмент кода для реализации этого метода:
public void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает IOException, ServletException
{
Выходной поток = ноль
Кодировка строки = request.getHeader("Accept-Encoding");
if (кодирование != null &&coding.indexOf("gzip") != -1)
{
request.setHeader("Кодирование контента", "gzip");
out = новый GZIPOutputStream(request.getOutputStream());
}
иначе, если (кодирование!= null &&coding.indexOf("compress") != -1)
{
request.setHeader("Кодирование контента", "сжать");
out = новый ZIPOutputStream(request.getOutputStream());
}
еще
{
выход = request.getOutputStream();
}
...
...
}
Способ 5. Использование пула потоков.
Сервер приложений по умолчанию создает поток для обработки каждого отдельного клиентского запроса и назначает им метод service(). Когда вызов метода service() завершается, соответствующий поток также отменяется. . Поскольку создание и удаление потоков потребляет определенные системные ресурсы, этот режим по умолчанию снижает производительность системы. Но, к счастью, мы можем изменить эту ситуацию, создав пул потоков. Кроме того, нам также необходимо установить минимальное и максимальное количество потоков для этого пула потоков. При запуске сервера приложений он создает пул потоков с числом, равным минимальному количеству потоков. Когда у клиента есть запрос, поток извлекается из пула для обработки. Когда обработка завершается, поток удаляется. положить обратно в бассейн посередине. Если в пуле недостаточно потоков, система автоматически увеличит количество потоков в пуле, но общее количество не может превышать максимальное количество потоков. При использовании пула потоков при резком увеличении клиентских запросов загрузка системы будет плавно возрастать, что улучшает масштабируемость системы.
Способ 6. Выберите правильный механизм включения страницы.
В JSP есть два метода, которые можно использовать для включения другой страницы: 1. Используйте индикатор включения (<%@ includee file="test.jsp" %>). 2. Используйте индикатор jsp (<jsp:includee page="test.jsp"lush="true"/>). На практике я обнаружил, что если использовать первый способ, производительность системы может быть выше.
Способ 7. Правильно определить жизненный цикл JavaBean.
Одним из мощных аспектов JSP является поддержка JavaBean. Используя тег <jsp:useBean> на странице JSP, javabeans можно вставить непосредственно на страницу JSP. Его использование выглядит следующим образом:
<jsp:useBean id="name"scope="page|request|session|application" class=
"package.className" type="typeName">
</jsp:useBean>
Атрибут области указывает жизненный цикл этого компонента. Жизненный цикл по умолчанию — страница. Если вы неправильно выберете жизненный цикл бина, это повлияет на производительность системы.
Например, если вы хотите использовать определенный bean-компонент только в одном запросе, но вы установили жизненный цикл bean-компонента на сеанс, тогда, когда запрос завершится, bean-компонент все равно останется в памяти, если только не истечет время ожидания сеанса или пользователь не закроет браузер. Это потребует определенного объема памяти и неоправданно увеличит рабочую нагрузку сборщика мусора JVM. Таким образом, установка правильного жизненного цикла для компонентов и их очистка как можно скорее после завершения их миссии улучшит производительность системы.
Некоторые другие полезные методы
: Старайтесь не использовать оператор «+» в операциях конкатенации строк: в программировании на Java мы часто используем оператор «+» для соединения нескольких строк, но вы, возможно, никогда об этом не думали. На самом деле это повлияет на систему. производительность, да? Поскольку строки являются константами, JVM будет генерировать временные объекты. Чем больше «+» вы используете, тем больше временных объектов будет создано, что также окажет определенное влияние на производительность системы. Решение состоит в том, чтобы использовать объект StringBuffer вместо оператора «+».
· Избегайте использования метода System.out.println(): поскольку System.out.println() является синхронным вызовом, то есть при его вызове операция дискового ввода-вывода должна дождаться своего завершения, поэтому мы должны попытаться избегайте использования этого вызова. Но это незаменимый и удобный инструмент при отладке программы. Чтобы решить это противоречие, я предлагаю вам использовать инструмент Log4j ( http://Jakarta.apache.org ), который может облегчить отладку без таких методов, как System.out. Будет создан .println().
· Компромиссы между ServletOutputStream и PrintWriter: использование PrintWriter может принести небольшие накладные расходы, поскольку он преобразует весь необработанный вывод в поток символов для вывода, поэтому, если он используется в качестве вывода страницы, системе приходится выполнять процесс преобразования. Нет проблем, если вы используете ServletOutputStream в качестве вывода страницы, но он выводится в двоичном виде. Поэтому при практическом применении необходимо взвесить плюсы и минусы того и другого.
Резюме
Целью этой статьи является значительное повышение производительности вашего приложения с помощью некоторых методов настройки сервлетов и JSP и, следовательно, повышение производительности всего приложения J2EE. С помощью этих методов настройки вы можете обнаружить, что не определенная техническая платформа (как, например, спор между J2EE и .NET) определяет производительность вашего приложения. Важно то, что вы имеете более глубокое понимание этой платформы. Только тогда вы сможете фундаментально оптимизировать свое приложение!