서브렛, Jsp 성능 최적화

저자: Rahul Chaudhary, gagaghost
 
당신의 J2EE 앱은 매우 느리게 실행됩니까?그것들은 끊임없이 증가하는 방문량을 감당할 수 있습니까?본고는 고성능, 고탄력성 JSP 페이지와 서브렛의 성능 최적화 기술을 개발하고자 한다.가능한 한 빠르고 수량 증가에 적응할 수 있는 사용자와 요구를 세우자는 뜻이다.본고에서 저는 당신을 데리고 이미 실천하고 증명된 성능 조정 기술을 배울 것입니다. 이것은 당신의 servlet과 jsp 페이지의 성능을 크게 향상시키고 J2EE의 성능을 향상시킬 것입니다.이러한 기술의 일부는 개발 단계, 예를 들어 디자인과 인코딩 단계에 사용된다.또 다른 기술은 배치와 관련이 있다.기술1: HttpServlet init() 메서드에서 캐시 데이터 서버는 servlet 인스턴스를 만든 후 servlet이 요청을 처리하기 전에 servlet의 init() 메서드를 호출합니다.이 방법은 servlet의 생명 주기에 한 번만 호출됩니다.성능을 향상시키기 위해 init () 에서 정적 데이터를 캐시하거나 초기화 기간에 완성해야 하는 대가가 비싼 작업을 완성합니다.예를 들어 가장 좋은 실천은javax를 사용하여 실현한 것이다.sql.DataSource 인터페이스의 JDBC 연결 풀DataSource는 JNDI 트리에서 사용할 수 있습니다.SQL이 호출될 때마다 JNDI를 사용하여 DataSource를 찾는 것은 매우 비싼 작업이며 응용 프로그램의 성능에 심각한 영향을 미쳤다.서브렛의 init() 방법을 사용하여 DataSource를 가져와 나중에 재사용할 수 있도록 캐시할 수 있습니다.

public class ControllerServlet extends HttpServlet
{
   private javax.sql.DataSource testDS = null;

   public void init(ServletConfig config) throws ServletException
   {
      super.init(config);
      Context ctx  = null;
      try
      {
         ctx = new InitialContext();
         testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
      }
      catch(NamingException ne)
      {
         ne.printStackTrace();              
       }
       catch(Exception e)
       {
          e.printStackTrace();
       }
   }

   public javax.sql.DataSource getTestDS()
      {
         return testDS;
      }
   ...
   ...
}


기술 2: 서브렛과 Jsp의 자동 마운트 기능 비활성화
서브렛/JSP를 수정할 때마다 서버를 재부팅해야 합니다.자동 적재 기능이 개발 시간을 줄이기 때문에 이 기능은 개발 단계에서 매우 유용하다고 여겨진다.그러나 운행 단계에서는 매우 비싸다.servlet/JSP는 불필요한 마운트로 인해 클래스 마운트의 부담을 증가시켜 성능이 매우 나쁘다.마찬가지로, 이것은 응용 프로그램이 이미 어떤 종류의 마운트에 마운트된 클래스가 현재 클래스 마운트에 마운트된 클래스와 서로 협력할 수 없기 때문에 이상한 충돌 현상을 일으킬 수 있습니다.따라서 운행 환경에서 더욱 좋은 성능을 얻기 위해 servlet/JSP의 자동 마운트 기능을 닫습니다.
기술 3: HttpSession 제어
많은 응용 프로그램들이 일련의 클라이언트의 요청을 필요로 하기 때문에 그들은 서로 관련될 수 있다.HTTP 프로토콜은 무상태이기 때문에 웹 기반 응용 프로그램은session이라는 상태를 유지해야 한다.상태를 유지해야 하는 응용을 지원하기 위해 자바servlet 기술은session을 관리하고 다양한 메커니즘이session을 실현할 수 있도록 하는 API를 제공합니다.HttpSession 객체는 session 역할을 하지만 사용하려면 비용이 필요합니다.HttpSession이 사용되고 재작성될 때마다 서브렛에서 읽습니다.다음과 같은 기술을 사용하여 성능을 향상시킬 수 있습니다.
  • JSP 페이지에서 기본 HttpSession을 만들지 마십시오. 기본적으로 JSP 페이지에서 HttpSession을 만듭니다.만약 JSP 페이지에서 HttpSession을 사용하지 않는다면, 성능 비용을 절약하기 위해 아래의 페이지 명령을 사용하면 자동으로 HttpSession 대상을 만드는 것을 피할 수 있습니다: <% @ 페이지 session = "false"% >
  • 큰 대상도를 HttpSession에 저장하지 마십시오. 만약 데이터를 큰 대상도로 HttpSession에 저장한다면 응용 서버는 매번 전체 HttpSession 대상을 처리해야 합니다.이렇게 하면 Java를 서열화하고 계산 비용을 증가시킬 수 있습니다.서열화된 비용으로 인해 HttpSession 대상에 저장된 데이터 대상이 커지면서 시스템의 토출량이 떨어질 것이다.
  • 사용 후 HttpSession 해제: HttpSession을 사용하지 않을 때 HttpSession을 사용합니다.invalidate () 방법은 sesion을 무효화시킵니다.
  • 시간 초과 설정: servlet 엔진에 기본 시간 초과 값이 있습니다.세션을 삭제하지 않거나 시간을 초과할 때 servlet 엔진은 세션을 메모리에서 삭제합니다.메모리와 쓰레기 수집에 대한 비용 때문에session의 시간 초과치가 클수록 시스템의 탄력성과 성능에 대한 영향도 크다.세션의 시간 초과 값을 가능한 한 낮게 설정해 보십시오.기술4: gzip 압축 압축을 사용하는 것은 불필요한 정보를 삭제하는 방법으로 가능한 한 작은 공간으로 당신의 정보를 설명합니다.gzip(GNU zip)을 사용하여 문서를 압축하면 HTML 파일을 다운로드하는 시간을 효과적으로 줄일 수 있습니다.너의 정보량이 적을수록 그것들은 보내는 속도가 빨라진다.따라서 웹 응용 프로그램에서 나오는 내용을 압축하면 사용자에게 도달하고 사용자 화면에 표시되는 속도가 빨라집니다.모든 브라우저가 gzip 압축을 지원하는 것은 아니지만, 브라우저가 그것을 지원하는지 확인하고 gzip 압축 내용을 브라우저에 보내는 것은 매우 쉽다.아래의 코드 세그먼트는 어떻게 압축된 내용을 보내는지 설명한다.
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
              throws IOException, ServletException
    {
              
       OutputStream out = null
    
       // Check the Accepting-Encoding header from the HTTP request.
       // If the header includes gzip, choose GZIP.
       // If the header includes compress, choose ZIP.
       // Otherwise choose no compression.
    
       String encoding = request.getHeader("Accept-Encoding");    
          
       if (encoding != null && encoding.indexOf("gzip") != -1)
       {
           response.setHeader("Content-Encoding" , "gzip");
           out = new GZIPOutputStream(response.getOutputStream());
       }
       else if (encoding != null && encoding.indexOf("compress") != -1)
       {
           response.setHeader("Content-Encoding" , "compress");
           out = new ZIPOutputStream(response.getOutputStream());
       }
       else
       {
           out = response.getOutputStream();
    
       }
       ...
       ...
    

    }기술5:SingleThreadModelSingleThreadModel을 사용하지 마십시오. servlet은 한 번에 하나의 요청만 처리할 수 있습니다.만약 servlet이 이 인터페이스를 실현한다면, servlet 엔진은 모든 새로운 요청에 하나의 단독 servlet 실례를 만들 것이다. 이것은 대량의 시스템 비용을 초래할 것이다.만약 당신이 라인 안전 문제를 해결할 필요가 있다면, 이 인터페이스를 대체하는 다른 방법을 사용하십시오.SingleThreadModel은 서브렛 2.4에서 더 이상 사용되지 않습니다.기술6: 스레드 탱크 servlet 엔진을 사용하여 모든 요청에 단독 스레드를 만들고 이 스레드를 서비스 () 방법에 파견한 다음 서비스 () 방법이 실행된 후에 삭제합니다.기본적으로 servlet 엔진은 모든 요청에 새로운 라인을 만들 수 있습니다.라인을 만들고 삭제하는 비용이 비싸기 때문에 이러한 기본 동작은 시스템의 성능을 떨어뜨린다.우리는 스레드 탱크를 사용하여 성능을 높일 수 있다.예상된 병렬 사용자 수에 따라 하나의 스레드 탱크를 설정하고 스레드 탱크의 스레드 수량의 최소와 최대치, 그리고 증가하는 최소와 최대치를 설정한다.처음에 servlet 엔진은 설정된 최소 스레드 수와 같은 스레드 탱크를 만들었습니다.그리고 servlet 엔진은 매번 새로운 라인을 만드는 것이 아니라 요청에 라인을 할당합니다. 작업이 끝난 후에 servlet 엔진은 라인을 라인으로 되돌려줍니다.스레드 탱크를 사용하면 성능이 현저하게 향상될 수 있다.만약 필요하다면, 라인의 최대 수와 성장 수에 따라 더 많은 라인을 만들 수 있다.기술7: 올바른 포괄 메커니즘을 선택한 JSP 페이지에는 명령어 (<% @ include file = "test. jsp"% >) 와 동작 () 을 포함하는 두 가지 방식이 있습니다.명령을 포함하여 컴파일 단계에서 지정한 파일의 내용을 포함한다.예를 들어, 한 페이지가 servlet으로 컴파일될 때.동작 포함은 요청 단계에서 파일 내용을 포함하는 것을 말한다.예를 들어 사용자가 페이지를 요청할 때지령을 포함하는 것이 동작을 포함하는 것보다 빠르다.따라서 포함된 파일이 자주 변동하지 않으면 포함 명령을 사용하면 더욱 좋은 성능을 얻을 수 있다.기술8:useBean 동작에서 적당한 범위를 사용하여 JSP 페이지를 사용하는 가장 강력한 방법 중 하나는 JavaBean 구성 요소와 협동하여 작업하는 것이다.JavaBean은 태그를 사용하여 JSP 페이지에 포함할 수 있습니다.구문은 다음과 같습니다.
    
    <jsp:useBean id="name" scope="page|request|session|application" class=
      "package.className" type="typeName">
    </jsp:useBean>
    
    

    scope 속성은 bean의 가시 범위를 설명합니다.scope 속성의 기본값은 페이지입니다.너는 응용의 수요에 따라 정확한 범위를 선택해야 한다. 그렇지 않으면 응용의 성능에 영향을 줄 것이다.예를 들어, 특정한 요청에 사용할 대상이 필요하지만, 범위를 세션으로 설정하면, 그 대상은 요청이 끝난 후에도 메모리에 저장됩니다.메모리에서 명확하게 삭제하거나 세션을 무효화하거나 세션이 시간을 초과하지 않으면 메모리에 저장됩니다.만약 당신이 정확한 범위 속성을 선택하지 않는다면, 메모리와 쓰레기 수집 비용이 성능에 영향을 줄 수 있기 때문이다.따라서 객체에 적합한 범위를 설정하고 객체를 사용한 후 즉시 삭제합니다.기타 기술
  • 문자열 연결을 피합니다. String 대상은 변할 수 없는 대상이기 때문에'+'조작부호를 사용하면 대량의 0시 대상을 만들 수 있습니다."+"를 많이 사용할수록 생산되는 0시 대상이 많아지므로 성능에 영향을 줄 수 있습니다.문자열을 연결할 필요가 있을 때, "+"동작을 StringBuffer로 대체합니다.
  • System을 사용하지 마십시오.out.println:System.out.println은 디스크 입력/출력을 동기화하여 시스템의 토출량을 크게 낮추었다.가능한 한 시스템 사용을 피하십시오.out.println.비록 많은 성숙한 디버깅 도구를 사용할 수 있지만, 때로는 시스템도 사용할 수 있다.out.println은 추적이나 디버깅을 위한 경우에도 유용합니다.너는 시스템을 설정해야 한다.out.println은 오류와 디버깅 단계에서만 열 수 있습니다.final Boolean형 변수를 사용하여 false로 설정되면 컴파일 단계에서 최적화 검사와 추적 출력을 실행합니다.
  • Servlet OutputStream과PrintWriter 비교: 문자 출력 흐름과 데이터를 바이트로 인코딩하기 때문에PrintWriter를 사용하여 작은 성능 비용을 도입했다.따라서 PrintWriter는 모든 문자 집합을 정확하게 변환한 후에 사용해야 합니다.다른 한편, servlet이 2진 데이터만 되돌려준다는 것을 알면, servlet 용기에서 2진 데이터를 인코딩하지 않기 때문에 문자 집합 변환 비용을 없앨 수 있습니다.본고의 목적은 servlet과 JSP의 성능을 향상시키는 데 사용되는 성능 최적화 기술을 보여주고 J2EE 응용의 전체적인 성능을 향상시키는 것이다.다음 단계는 EJB, JMS, JDBC 등 다른 관련 기술의 성능 조정을 관찰해야 한다.작성자 Email:[email protected]
  • 좋은 웹페이지 즐겨찾기