자바 성능 튜닝 이야기 6주차
자바 성능 튜닝 이야기 6주차
들어가며
이 포스트는 이상민의 「자바 성능 튜닝 이야기」 Chpater12 ~ 14을 읽고 개인적으로 학습한 내용을 정리한 글입니다.
- 책: 자바 성능 튜닝 이야기
- 저자: 이상민
- 출판사: 인사이트
- 챕터: Chapter12 ~ Chapter 14
핵심 정리 내용
12장 DB를 사용하면서 발생 가능한 문제점들
DB Connection과 Connection Pool, DataSource
- DB Connection Pool은 Connection 객체를 생성하는 부분에서 발생하는 대기 시간을 감소시킴
- Statement, PreparedStatement의 차이는 cache 사용 여부
- 쿼리문 수행 프로세스
- 쿼리 문장 분석
- 컴파일
- 실행
- Statement는 캐시 없이 매번 프로세스를 실행하고 PreparedStatement는 처음 한 번만 세 단계를 거치고 캐시를 담아서 재사용
DB를 사용할 때 닫아야 하는 것들
- Connection, Statement 관련 인터페이스, ResultSet 인터페이스는 close() 메서드를 사용해야함
- DB와 JDBC 리소스 해제를 위해 자동으로 close()가 호출되지만 임의로 수행하는 것이 좋음
JDK 7에서 등장한 AutoClosable 인터페이스
- try-with-resource
- finally를 호출할 필요없이 AutoClosable로 자동 close
JDBC를 사용하면서 유의할 만한 몇 가지 팁
- setAutoCommit() 메서드는 필요할 때만 사용하자
- 여러 개의 쿼리를 동시에 실행할 경우 성능에 영향을 주므로 사용을 자제하자
- 배치성 작업은 executeBatch() 메서드를 사용하자
- 여러 개의 쿼리를 한 번에 수행할 수 있어 JDBC 호출 횟수가 감소해 성능이 좋아진다
- setFetchSize() 메서드를 사용해 데이터를 더 빠르게 가져오자
- setFetchSize에 데이터 수를 정하는 것이 좋다
- 한 건만 필요할 때는 한 건만 가져오자
13장 XML과 JSON도 잘 쓰자
자바에서 사용하는 XML 파서의 종류는?
- XML의 장점은 누구나 데이터의 구조를 정의하고 공유함으로써 일관된 데이터 전송 및 처리가 가능함
- 자바에서는 XML 파싱을 위해 JAXP를 제공
- SAXParser Factory
- XML을 순차적 방식으로 처리
- DOM 방식에 비해 메모리 부담이 적음
- 순차적인 이벤트 처리로 이미 읽은 데이터의 구조를 수정하거나 삭제하기 어려움 -DocumentBuilderFactory
- 모든 XML을 읽어 Tree로 만든 후 XML을 처리
- 메모리 부담이 큼
- XML에 노드를 추가,수정,삭제하기 쉬운 구조
- SAXParser Factory
XML 파서가 문제가 된 사례
- XML에 특수문자가 있는 경우 파서가 제대로 해석하지 못할 경우 이슈가 발생할 수 있음
JSON과 파서들
- JSON
- name/value 형태의 쌍으로 collection /xkdlq
- 값의 순서가 있는 목록 타입
14장 서버를 어떻게 세팅해야 할까?
설정해야 하는 대상
- 서버 병목을 확인하는 가장 좋은 방법은 성능 테스트를 통해 병목 지점을 미리 파악하는 것
- 웹 기반 시스템에서 성능에 영향을 줄만한 세팅
- 웹 서버 세팅
- WAS 서버 세팅
- DB 서버 세팅
- 장비 세팅
아파치 웹 서버의 설정
- WAS를 웹 서버로 사용하면 안된다
- 웹 서버는 WAS 반드시 앞에 두어야 한다
- 정적 부분은 웹 서버가 처리해야 한다
- 아파치 웹 서버 설정 - httpd.conf
- ThreadsPerChild 250
- 웹 서버가 사용하는 스레드의 개수 지정
- MaxRequestsPerChild 0
- 최대 요청 개수 지정
- StartServers
- 서버 시작 시 사용할 프로세스 개수 지정
- MaxClients
- 최대 처리 가능한 클라이언트 수
- MinSpareThreads
- 최소 여유 스레스 수 지정
- MaxSpareThreads
- 최대 여유 스레스 수 지정
- MaxRequestsPerChild
- MaxRequestsPerChild 와 동일
- KeppAlive
- off 할 경우 매번 HTTP 연결을 맺고 끊는다 > on을 하면 대기 시간이 짧아져 사용자가 느끼는 응답속도가 빨라진다
- ThreadsPerChild 250
DB Connection Pool 및 스레드 개수 설정
- DB Connection Pool 설정
- 보통 40~50개
- 스레드 수는 DB Connection Pool + 10
- wait time 설정도 중요(mybatis의 poolTimeToWait)
- 기본이 20초
WAS 인스턴스 개수 설정
- 보통은 1~2개의 CPU당 하나의 인스턴스를 지정하는 것이 좋음
- 가장 바람직한 것은 장비 하나당 인스턴스 개수는 성능 테스트를 통해 산출하는 것이 좋음
Session Timeout 시간 설정
- 세션 설정이 없는 경우 WAS에서 따로 설정한 바가 없거나 세션 객체의 invalidate() 메서드를 수행하지 않으면 세션은 삭제되지 않는다
This post is licensed under CC BY 4.0 by the author.