서브렛, Jsp 성능 최적화
당신의 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이 사용되고 재작성될 때마다 서브렛에서 읽습니다.다음과 같은 기술을 사용하여 성능을 향상시킬 수 있습니다.
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 속성의 기본값은 페이지입니다.너는 응용의 수요에 따라 정확한 범위를 선택해야 한다. 그렇지 않으면 응용의 성능에 영향을 줄 것이다.예를 들어, 특정한 요청에 사용할 대상이 필요하지만, 범위를 세션으로 설정하면, 그 대상은 요청이 끝난 후에도 메모리에 저장됩니다.메모리에서 명확하게 삭제하거나 세션을 무효화하거나 세션이 시간을 초과하지 않으면 메모리에 저장됩니다.만약 당신이 정확한 범위 속성을 선택하지 않는다면, 메모리와 쓰레기 수집 비용이 성능에 영향을 줄 수 있기 때문이다.따라서 객체에 적합한 범위를 설정하고 객체를 사용한 후 즉시 삭제합니다.기타 기술
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
깊이 중첩된 객체를 정확히 일치 검색 - PostgreSQL목차 * 🚀 * 🎯 * 🏁 * 🙏 JSON 객체 예시 따라서 우리의 현재 목표는 "고용주"사용자가 입력한 검색어(이 경우에는 '요리')를 얻고 이 용어와 정확히 일치하는 모든 사용자 프로필을 찾는 것입니다. 즐거운 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.