JSP 페이지의 느린 응답 속도에 대해 고객으로부터 불만을 자주 받습니까? 고객 방문 수가 급격히 증가할 때 웹 애플리케이션이 어떻게 증가하는 방문 수를 견딜 수 있는지 생각해 본 적이 있습니까? 이 글에서는 JSP와 서블릿을 조정하는 몇 가지 매우 실용적인 방법을 설명합니다. 이를 통해 서블릿과 JSP 페이지의 반응성과 확장성을 높일 수 있습니다. 또한, 사용자 수가 증가함에 따라 시스템 부하도 완만한 상승 추세를 보일 것입니다. 이 기사에서는 예기치 않게 애플리케이션의 성능을 향상시키기 위해 몇 가지 실제 예제와 구성 방법을 사용합니다. 이러한 튜닝 기술 중 일부는 프로그래밍 작업에 구현됩니다. 다른 기술은 애플리케이션 서버 구성과 관련되어 있습니다. 이 기사에서는 서블릿과 JSP 페이지를 조정하여 애플리케이션의 전반적인 성능을 향상시키는 방법을 자세히 설명합니다. 이 글을 읽기 전, 여러분이 서블릿과 JSP에 대한 기본 지식을 가지고 있다고 가정합니다.
방법 1: 서블릿의 init() 메소드에 데이터를 캐시합니다.
애플리케이션 서버는 서블릿 인스턴스를 초기화한 후 클라이언트 요청을 제공하기 전에 서블릿의 init() 메소드를 호출합니다. 서블릿의 라이프사이클에서 init() 메소드는 한 번만 호출됩니다. init() 메서드에서 일부 정적 데이터를 캐시하거나 한 번만 수행하면 되는 시간이 많이 소요되는 일부 작업을 완료하면 시스템 성능이 크게 향상될 수 있습니다.
예를 들어, init() 메소드에서 JDBC 연결 풀을 설정하는 것이 가장 좋은 예입니다. 일반적인 상황에서는 JNDI 소스를 통해 특정 데이터를 가져오기 위해 jdbc2.0의 인터페이스를 사용한다고 가정합니다. 특정 애플리케이션에서 모든 SQL 요청에 대해 JNDI 쿼리가 실행되면 시스템 성능이 급격히 떨어질 것이라고 상상할 수 있습니다. 해결책은 다음 SQL 호출 중에 계속 사용할 수 있도록 DataSource를 캐시하는 다음 코드입니다.
public class ControllerServlet은 HttpServlet을 확장합니다.
{
개인 javax.sql.DataSource testDS = null;
public void init(ServletConfig config)에서 ServletException이 발생합니다.
{
super.init(config);
컨텍스트 ctx = null;
노력하다
{
ctx = 새로운 초기컨텍스트();
testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}
catch(NamingException ne)
{
ne.printStackTrace();
}
잡기(예외e)
{
e.printStackTrace();
}
}
공개 javax.sql.DataSource getTestDS()
{
testDS를 반환합니다.
}
...
...
}
방법 2: 서블릿 및 JSP 자동 리로딩 비활성화(auto-reloading)
서블릿/JSP는 애플리케이션을 다시 시작할 필요 없이 서블릿 및 JSP 페이지를 변경할 때 개발자에게 좋은 개발 환경을 제공하는 실용적인 기술, 즉 자동 리로딩 기술을 제공합니다. 섬기는 사람. 그러나 이 기술은 JSP 엔진의 클래스 로더에 큰 부담을 주기 때문에 제품 실행 단계에서 시스템 자원의 손실이 크다. 따라서 자동 재로드 기능을 끄는 것은 시스템 성능을 향상시키는 데 큰 도움이 됩니다.
방법 3: HttpSession을 남용하지 마세요.
많은 애플리케이션에서 우리 프로그램은 페이지가 서로 통신할 수 있도록 클라이언트 상태를 유지해야 합니다. 그러나 불행하게도 HTTP는 본질적으로 상태 비저장이기 때문에 클라이언트의 상태를 저장할 수 없습니다. 따라서 일반 응용서버에서는 클라이언트의 상태를 저장하기 위한 세션을 제공한다. JSP 애플리케이션 서버에서는 HttpSession 객체를 통해 세션 기능을 구현하지만, 편리하지만 시스템에 많은 부담을 준다. 세션을 얻거나 업데이트할 때마다 시스템 운영자는 이에 대해 시간이 많이 걸리는 직렬화 작업을 수행해야 하기 때문입니다. 다음과 같은 방법으로 HttpSession을 처리하여 시스템 성능을 향상시킬 수 있습니다.
· 필요하지 않은 경우 JSP 페이지에서 HttpSession에 대한 기본 설정을 꺼야 합니다. 명시적으로 지정하지 않으면 각 JSP 페이지는 기본적으로 HttpSession 생성으로 설정됩니다. . JSP에서 세션을 사용할 필요가 없다면 다음 JSP 페이지 표시기를 통해 세션을 비활성화할 수 있습니다:
<%@ page session="false"%>
· HttpSession에 큰 데이터 객체를 저장하지 마십시오: 객체가 HttpSession에 저장되면 애플리케이션 서버는 읽거나 쓸 때마다 이를 직렬화하므로 시스템에 추가 부담이 추가됩니다. HttpSession에 저장하는 데이터 개체가 클수록 시스템 성능이 더 빨리 저하됩니다.
· HttpSession이 더 이상 필요하지 않으면 가능한 한 빨리 해제하세요. 세션이 더 이상 필요하지 않으면 HttpSession.invalidate() 메서드를 호출하여 해제할 수 있습니다.
· 세션 시간 초과를 가능한 한 짧게 설정하십시오. JSP 응용 프로그램 서버에는 기본 세션 시간 초과가 있습니다. 이 시간 이후 고객이 어떤 작업도 수행하지 않으면 시스템은 자동으로 해당 세션을 메모리에서 해제합니다. 제한 시간을 크게 설정할수록 시스템 성능이 저하되므로 해당 값을 최대한 낮게 유지하는 것이 가장 좋은 방법입니다.
방법 4: 페이지 출력을 압축하는 것은
특히 네트워크 대역폭이 충분히 개발되지 않은 오늘날 데이터 중복성을 해결하는 좋은 방법입니다. 일부 브라우저에서는 HTML 파일을 압축하기 위해 gzip(GNU zip)을 지원합니다. 이 방법을 사용하면 HTML 파일의 다운로드 시간을 크게 줄일 수 있습니다. 따라서 서블릿이나 JSP 페이지에서 생성된 HTML 페이지를 압축하면 사용자는 페이지 탐색 속도가 매우 빨라질 것이라고 느낄 것이다. 불행하게도 모든 브라우저가 gzip 압축을 지원하는 것은 아니지만 클라이언트 브라우저가 이를 지원하는지 프로그램에서 확인할 수 있습니다. 다음은 이 메소드 구현을 위한 코드 조각입니다:
public void doGet(HttpServletRequest request, HttpServletResponse response)
IOException, ServletException 발생
{
OutputStream 출력 = null
문자열 인코딩 = request.getHeader("Accept-Encoding");
if (인코딩 != null && 인코딩.indexOf("gzip") != -1)
{
request.setHeader("콘텐츠 인코딩" , "gzip");
out = new GZIPOutputStream(request.getOutputStream());
}
else if (인코딩 != null && 인코딩.indexOf("압축") != -1)
{
request.setHeader("콘텐츠 인코딩" , "압축");
out = new ZIPOutputStream(request.getOutputStream());
}
또 다른
{
아웃 = request.getOutputStream();
}
...
...
}
방법 5: 스레드 풀을 사용합니다.
애플리케이션 서버는 기본적으로 서로 다른 클라이언트 요청을 처리하기 위한 스레드를 생성하고 이에 service() 메서드를 할당합니다. service() 메서드 호출이 완료되면 해당 스레드도 취소됩니다. . 스레드를 생성하고 삭제하면 특정 시스템 리소스가 소비되므로 이 기본 모드는 시스템 성능을 저하시킵니다. 하지만 다행스럽게도 스레드 풀을 생성하여 이러한 상황을 바꿀 수 있습니다. 또한 이 스레드 풀에 대한 최소 스레드 수와 최대 스레드 수도 설정해야 합니다. 애플리케이션 서버가 시작되면 최소 스레드 수와 동일한 수의 스레드 풀을 생성하며, 고객이 요청하면 스레드를 풀에서 꺼내어 처리합니다. 다시 수영장에 넣습니다. 풀에 스레드 수가 충분하지 않은 경우 시스템은 자동으로 풀의 스레드 수를 늘리지만 총 스레드 수는 최대 스레드 수를 초과할 수 없습니다. 스레드 풀을 사용하면 클라이언트 요청이 급격히 증가할 때 시스템 부하가 완만한 상승 곡선을 보여 시스템 확장성이 향상됩니다.
방법 6: 올바른 페이지 포함 메커니즘 선택
JSP에는 다른 페이지를 포함하는 데 사용할 수 있는 두 가지 방법이 있습니다. 1. 포함 표시기를 사용합니다(<%@ includee file="test.jsp" %>). 2. jsp 표시기(<jsp:includee page="test.jsp" flash="true"/>)를 사용합니다. 실제로는 첫 번째 방법을 사용하면 시스템 성능이 더 높아질 수 있다는 것을 알았습니다.
방법 7: javabeans의 라이프사이클을 올바르게 결정합니다.
JSP의 강력한 측면 중 하나는 javabeans에 대한 지원입니다. JSP 페이지에서 <jsp:useBean> 태그를 사용하면 javabeans를 JSP 페이지에 직접 삽입할 수 있습니다. 사용법은 다음과 같습니다:
<jsp:useBean id="name" range="page|request|session|application" class=
"패키지.클래스이름" type="typeName">
</jsp:useBean>
범위 속성은 이 Bean의 수명 주기를 나타냅니다. 기본 라이프사이클은 페이지입니다. Bean 수명주기를 올바르게 선택하지 않으면 시스템 성능에 영향을 미칩니다.
예를 들어, 하나의 요청에서 특정 Bean만 사용하려고 하지만 Bean의 라이프사이클을 세션으로 설정한 경우 요청이 종료되면 세션 시간 초과 또는 사용자가 브라우저를 닫지 않는 한 Bean은 메모리에 계속 남아 있습니다. 이는 일정량의 메모리를 소비하고 JVM 가비지 수집기의 작업 부하를 불필요하게 증가시킵니다. 따라서 빈의 올바른 수명 주기를 설정하고 임무가 끝난 후 가능한 한 빨리 정리하면 시스템 성능이 향상됩니다.
기타 유용한 방법
: 문자열 연결 작업에 "+" 연산자를 사용하지 마세요. Java 프로그래밍에서는 여러 문자열을 연결하기 위해 "+" 연산자를 자주 사용하지만 실제로는 시스템에 영향을 미칠 것이라고 생각하지 못할 수도 있습니다. 성능 맞죠? 문자열은 상수이므로 JVM은 일부 임시 개체를 생성합니다. "+"를 더 많이 사용할수록 더 많은 임시 개체가 생성되며 이는 시스템 성능에도 어느 정도 영향을 미칩니다. 해결책은 "+" 연산자 대신 StringBuffer 개체를 사용하는 것입니다.
· System.out.println() 메서드 사용을 피하세요. System.out.println()은 동기 호출, 즉 호출 시 디스크 I/O 작업이 완료될 때까지 기다려야 하므로 다음을 시도해야 합니다. 전화를 사용하지 마십시오. 하지만 이 모순을 해결하려면 System.out과 같은 메서드 없이 디버깅을 용이하게 할 수 있는 Log4j 도구( http://Jakarta.apache.org )를 사용하는 것이 좋습니다. .println()이 생성됩니다.
· ServletOutputStream과 PrintWriter 사이의 장단점: PrintWriter를 사용하면 약간의 오버헤드가 발생할 수 있습니다. 모든 원시 출력을 출력용 문자 스트림으로 변환하므로 페이지 출력으로 사용하는 경우 시스템에서 변환 프로세스를 수행해야 하기 때문입니다. ServletOutputStream을 페이지 출력으로 사용하면 문제가 없으나 바이너리로 출력됩니다. 따라서 실제 적용에서는 두 가지 모두의 장단점을 평가해야 합니다.
요약
이 기사의 목적은 서블릿과 JSP에 대한 몇 가지 조정 기술을 통해 애플리케이션의 성능을 크게 향상시켜 전체 J2EE 애플리케이션의 성능을 향상시키는 것입니다. 이러한 튜닝 기술을 통해 애플리케이션의 성능을 결정하는 것은 특정 기술 플랫폼(예: J2EE와 .NET 간의 논쟁)이 아니라는 점을 알 수 있습니다. 중요한 것은 이 플랫폼에 대해 더 깊이 이해하고 있다는 것입니다. 그래야만 애플리케이션을 근본적으로 최적화할 수 있습니다!