Метод 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();}
}catch(Исключение е){e.printStackTrace();}
}
общественный javax.sql.DataSource getTestDS() {
вернуть testDS;
}
...
...
}
Способ 2: Отключить автоматическую перезагрузку сервлетов и JSP (автоматическая перезагрузка)
Servlet/JSP предоставляет практическую технологию, а именно технологию автоматической перезагрузки, которая предоставляет разработчикам хорошую среду разработки при изменении страниц сервлета и JSP без необходимости перезапуска сервера приложений. Однако эта технология представляет собой огромную потерю системных ресурсов на этапе запуска продукта, поскольку она принесет огромную нагрузку на загрузчик классов движка JSP. Поэтому отключение функции автоматической перезагрузки является отличным подспорьем для повышения производительности системы.
Способ 3. Не злоупотребляйте HttpSession.
Во многих приложениях нашей программе необходимо поддерживать состояние клиента, чтобы страницы могли взаимодействовать друг с другом. Но, к сожалению, поскольку HTTP по своей сути не имеет состояния, он не может сохранять состояние клиента. Поэтому обычные серверы приложений предоставляют сеансы для сохранения состояния клиента. В сервере приложений JSP функция сеанса реализована через объект HttpSession, но хоть это и удобно, но в то же время наносит большую нагрузку на систему. Потому что каждый раз, когда вы получаете или обновляете сеанс, системному оператору приходится выполнять трудоемкие операции сериализации. Вы можете повысить производительность системы с помощью следующих методов обработки HttpSession.
Если в этом нет необходимости, настройки по умолчанию для HttpSession на странице JSP следует отключить. Каждая страница JSP по умолчанию создает HttpSession, если вы не укажете его явно. Если вам не нужно использовать сеанс в JSP, вы можете отключить его с помощью следующего индикатора страницы JSP:
Ниже приведен справочный фрагмент:
<%@ сессия страницы="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 (encoding != null &&coding.indexOf("gzip") != -1){
request.setHeader("Кодирование контента", "gzip");
out = новый GZIPOutputStream(request.getOutputStream());
}
иначе if (encoding != null &&coding.indexOf("comdivss") != -1){
request.setHeader("Кодирование контента", "comdivss");
out = новый ZIPOutputStream(request.getOutputStream());
}еще{
выход = request.getOutputStream();
}
...
...
}
Способ 5. Использование пула потоков.
Сервер приложений по умолчанию создает поток для обработки каждого отдельного клиентского запроса и назначает им метод service(). Когда вызов метода service() завершается, соответствующий поток также отменяется. . Поскольку создание и удаление потоков потребляет определенные системные ресурсы, этот режим по умолчанию снижает производительность системы. Но, к счастью, мы можем изменить эту ситуацию, создав пул потоков.
Кроме того, нам также необходимо установить минимальное и максимальное количество потоков для этого пула потоков. При запуске сервера приложений он создает пул потоков с числом, равным минимальному количеству потоков. Когда у клиента есть запрос, поток извлекается из пула для обработки. Когда обработка завершается, поток удаляется. положить обратно в бассейн посередине. Если в пуле недостаточно потоков, система автоматически увеличит количество потоков в пуле, но общее количество не может превышать максимальное количество потоков. При использовании пула потоков при резком увеличении клиентских запросов загрузка системы будет плавно возрастать, что улучшает масштабируемость системы.
Способ 6. Выберите правильный механизм включения страницы.
В JSP есть два метода, которые можно использовать для включения другой страницы:
1. Используйте директиву include.
Ниже приведен справочный фрагмент.
<%@ includee file="test.jsp" %>
2. Используйте индикатор jsp.
Ниже приведен справочный фрагмент:
<jsp:includee page="test.jsp"lush="true"/>
На практике установлено, что при использовании первого метода производительность системы может быть выше.
Способ 7. Правильно определить жизненный цикл JavaBean.
Одним из мощных аспектов JSP является поддержка JavaBean. JavaBeans можно вставить непосредственно в страницу JSP, используя тег jsp:useBean на странице JSP. Вот как его использовать:
Вот фрагмент цитаты:
<jsp:useBean id="name"scope="страница|запрос|сессия|приложение"
class="package.className" type="typeName">
</jsp:useBean>
Атрибут области указывает жизненный цикл этого компонента. Жизненный цикл по умолчанию — страница. Если вы неправильно выберете жизненный цикл бина, это повлияет на производительность системы.
Например, если вы хотите использовать определенный bean-компонент только в одном запросе, но вы установили жизненный цикл bean-компонента на сеанс, тогда, когда запрос завершится, bean-компонент все равно останется в памяти, если только не истечет время ожидания сеанса или пользователь не закроет браузер. Это потребует определенного объема памяти и неоправданно увеличит рабочую нагрузку сборщика мусора JVM. Таким образом, установка правильного жизненного цикла для компонентов и их очистка как можно скорее после завершения их миссии улучшит производительность системы.
Некоторые другие полезные методы
1. Старайтесь не использовать оператор «+» в операциях соединения строк: в Java-программировании мы часто используем оператор «+» для соединения нескольких строк, но вы, возможно, никогда не задумывались об этом, повлияет ли это на самом деле. производительность системы Поскольку строки являются константами, JVM будет генерировать временные объекты. Чем больше «+» вы используете, тем больше временных объектов будет создано, что также окажет определенное влияние на производительность системы. Решение состоит в том, чтобы использовать объект StringBuffer вместо оператора «+».
2. Избегайте использования метода System.out.println(): поскольку System.out.println() является синхронным вызовом, то есть при его вызове операция дискового ввода-вывода должна дождаться своего завершения, поэтому следует попробовать чтобы избежать его использования. Но это незаменимый и удобный инструмент при отладке программы. Чтобы решить это противоречие, я предлагаю вам использовать инструмент Log4j ( http://Jakarta.apache.org ), который может облегчить отладку без таких методов, как System.out. Будет создан .println().
3. Компромисс между ServletOutputStream и PrintWriter. Использование PrintWriter может принести небольшие накладные расходы, поскольку он преобразует весь исходный вывод в поток символов для вывода, поэтому, если он используется в качестве вывода страницы, системе приходится выполнять процесс преобразования. Нет проблем, если вы используете ServletOutputStream в качестве вывода страницы, но он выводится в двоичном виде. Поэтому при практическом применении необходимо взвесить плюсы и минусы того и другого.
Резюме
Целью этой статьи является значительное повышение производительности вашего приложения с помощью некоторых методов настройки сервлетов и JSP и, следовательно, повышение производительности всего приложения J2EE. С помощью этих методов настройки вы можете обнаружить, что не определенная техническая платформа (как, например, спор между J2EE и .NET) определяет производительность вашего приложения. Важно то, что вы имеете более глубокое понимание этой платформы. Только тогда вы сможете фундаментально оптимизировать свое приложение.