Post

자바 성능 튜닝 이야기 6주차

자바 성능 튜닝 이야기 6주차

들어가며

이 포스트는 이상민의 「자바 성능 튜닝 이야기」 Chpater12 ~ 14을 읽고 개인적으로 학습한 내용을 정리한 글입니다.

  • 책: 자바 성능 튜닝 이야기
  • 저자: 이상민
  • 출판사: 인사이트
  • 챕터: Chapter12 ~ Chapter 14

핵심 정리 내용

12장 DB를 사용하면서 발생 가능한 문제점들

DB Connection과 Connection Pool, DataSource

  • DB Connection Pool은 Connection 객체를 생성하는 부분에서 발생하는 대기 시간을 감소시킴
  • Statement, PreparedStatement의 차이는 cache 사용 여부
  • 쿼리문 수행 프로세스
    1. 쿼리 문장 분석
    2. 컴파일
    3. 실행
      • 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에 노드를 추가,수정,삭제하기 쉬운 구조

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을 하면 대기 시간이 짧아져 사용자가 느끼는 응답속도가 빨라진다

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.