EJB(Enterprise JavaBeans) 3.3 사양(JSR 220)에 소개된 Java Persistence API(또는 간단히 Java Persistence)는 데이터 지속성을 사용하는 Java EE 애플리케이션의 개발을 단순화시킵니다. Converting a POJO to a Persistent Entity, Inheritance and the Java Persistence API 및 Using Java Persistence With JavaServer Faces Technology와 같은 이전 테크팁에서는 Java Persistence API의 다양한 측면을 다루었습니다. 이 팁에서는 Toplink Essentials라는 GlassFish에서 Java Persistence 구현을 조정하는 방법에 대해 설명합니다.
이 팁에 소개된 예제는 GlassFish와 함께 번들로 제공되는 customer-cmp 샘플에 기반합니다. 샘플은 GlassFish Samples 페이지에서 다운로드할 수 있습니다. 이 팁에서는 다른 모드 in-container 및 out-of container에서 사용되는 Java Persistence 구현에 대한 성능 조정을 다룹니다. 또한 Faban 프레임워크를 사용하여 다른 성능 조정 매개변수를 보여 줍니다.
조정 매개변수에 대해 설명하기 전에 in-container 및 out-of container 모드와 Faban 프레임워크를 살펴 보겠습니다.
Java Persistence 구현 실행의 두 가지 모드
JSR-220과 호환되는 Java Persistence 구현을 in-container 및 out-of-container 두 가지 모드 중 하나로 사용할 수 있습니다. 이것은 EJB 2.1의 컨테이너 관리 지속성과 같은 이전 엔터프라이즈 Java Persistence 구현 간의 눈의 띄는 차이점입니다. Java Persistence 구현은 EJB 2.1 컨테이너 관리 지속성과 함께 in-container 모드를 사용해야만 실행할 수 있습니다.
In-container 모드는 Java Persistence 구현이 EJB 컨테이너의 내부에서 사용됨을 의미합니다. 지속성 엔터티를 관리하는 개체인 EntityManager는 일반적으로 EJB 컨테이너에서 생성됩니다. 엔터티 관리자는 일반적으로 JTA 엔터티 관리자입니다. 즉, JTA(Java Transaction Architecture)에서 제어하는 트랜잭션에 참여합니다. 그러나 Java Persistence 구현은 JTA 엔터티 관리자와 리소스-로컬 엔터티 관리자 모두를 지원합니다. 즉, JTA에서 관리하지 않는 트랜잭션에 참여하는 엔터티 관리자를 지원합니다.
out-of-container 모드에서 Java Persistence 구현은 독립형이거나 웹 컨테이너 내부에서 실행합니다. 애플리케이션은 고유의 엔터티 관리자를 생성합니다. 트랜잭션은 일반적으로 리소스-로컬입니다. 구현이 독립형으로 실행하면 JTA를 지원하지 않아도 됩니다.
Faban 드라이버 프레임워크
Faban은 오픈 소스 드라이버 프레임워크입니다. 개발자는 이 프레임워크를 사용하여 성능 드라이버를 빠르게 개발할 수 있도록 드라이버 논리 구현에 집중할 수 있습니다. Faban은 로드 생성, 출력 서식 및 작업 시간과 같은 일반 작업을 다룹니다. Faban에 대한 자세한 내용은 Faban 프로젝트 페이지를 참조하십시오.
샘플 애플리케이션 조정
customer-cmp 샘플 애플리케이션은 저장할 관련 데이터베이스와 상호작용하고 정기적으로 고객 구독에 대한 정보를 표시합니다. 데이터베이스는 고객의 구독 유형(잡지, 저널 또는 신문)뿐만 아니라 고객 이름 및 주소와 같은 정보를 저장합니다. 사용자는 구독 관련 정보를 표시하도록 애플리케이션에 요청을 제출합니다.
이 팁은 애플리케이션에서 지원되는 작업 중 하나인 ID로 고객 찾기에 초점을 둡니다.
캐시 크기 및 연결 풀 수 변경
특정 조정 매개변수가 이러한 작업의 결합된 처리에 미치는 영향을 살펴 보겠습니다. 특히 Toplink Essentials에서 캐시 크기를 변경하고 데이터베이스 호출을 위해 GlassFish의 연결 풀에서 연결 수를 재설정하는 영향에 대해 살펴 보겠습니다.
Toplink Essentials 구현은 기본적으로 엔터티당 1000의 캐시 크기를 가집니다. 캐시 설정의 영향을 알아보기 위해 기본 캐시 크기를 사용하여 트랜잭션 속도를 살펴 보겠습니다. 그런 다음 캐시 크기를 5000으로 변경하고 결과를 비교해 보겠습니다.
캐시 크기를 설정하려면 프로젝트의 persistence.xml 파일을 업데이트하고 toplink.cache.size.default 등록 정보를 다음과 같이 설정해야 합니다.
<property name="toplink.cache.size.default" value="5000"/>
이 예제에서는 데이터베이스에 20,0000개의 고객 엔터티가 있습니다.
캐시 설정은 in-container 및 out-of-container 모드 모두에 적용됩니다. 그러나 연결 풀 설정은 in-container 또는 out-of-container 모드를 사용하느냐에 따라 다르게 처리됩니다. In-container 모드의 경우 연결 풀 설정은 GlassFish에서 수행되며 데이터 소스 구성으로 제어됩니다. 이 모드에서는 아래와 같이 GlassFish 관리 콘솔을 사용하여 연결 풀을 구성할 수 있습니다.
결 풀 편집 큰 이미지를 보려면 여기를 클릭하십시오.
in-container 모드의 경우 컨테이너 내의 연결 풀에서 연결 수를 GlassFish에서 구성된 요청 처리 스레드 수(이 경우 40)로 설정하십시오. 이것은 언제든지 활성화할 수 있는 최대 스레드 수이므로 데이터베이스 호출 시 Toplink Essentials에 필요한 최대 연결 수가 됩니다.
out-of-container 모드의 경우 연결 풀은 persistence.xml 파일에서 설정됩니다. Toplink Essentials 구현은 읽기 및 쓰기 연결 모두에 대해 8개 연결의 기본 연결 풀 설정을 가집니다. 8명의 사용자에 대해 out-of-container 모드에서 애플리케이션을 실행하여 연결 풀 값을 8개 연결로 설정해 보겠습니다.
결과
in-container 모드를 사용하여 Toplink Essentials를 실행하면 다음과 유사한 결과가 생성됩니다.
| 캐시 크기 | 트랜잭션/초 | ||
| 1000(기본값) | 1911.493 | ||
| 5000 | 3727.253 | ||
out-of-container 모드를 사용하여 Toplink Essentials를 실행하면 다음과 유사한 결과가 생성됩니다.
| 캐시 크기/ 연결 풀 |
트랜잭션/초 | ||
| 1000/기본값* | 1456.153 | ||
| 5000/8 | 6510.0 | ||
* 기본값은 다음과 같습니다.
toplink.jdbc.read-connections.min = 2
toplink.jdbc.read-connections.max = 2
toplink.jdbc.write-connections.max = 10
toplink.jdbc.write-connections.min = 5
기본값이 사용되면 연결 풀이 기본 최소 설정으로 초기화되고 기본 최대 설정으로 지정된 최대값까지 확장될 수 있습니다. 연결 풀 값 8을 설정하면 풀에 항상 8개의 연결이 있습니다.
테스트용 시스템 구성은 다음과 같습니다.
Sun Fire V880, Solaris 10, 4 CPU(SUT(System under test의 경우).
Sun Fire V880, Solaris 10, 12 CPU(드라이버 시스템의 경우)
드라이버와 SUT는 out-of-container 테스트에 대해 동일한 시스템입니다. 드라이버 시스템과 SUT는 지점간 이더넷 연결을 가집니다. 즉, 외부 네트워크 트래픽이 없습니다.
요약
Java Persistence 구현을 최상으로 구현하려면 구현에서 제공하는 조정 매개변수를 이해하는 것이 중요합니다.
캐시 설정은 Toplink Essentials 구현에서 제공하는 중요한 조정 매개변수입니다. GlassFish에서 제공한 연결 풀 설정을 조정하는 것도 GlassFish에 사용된 Java Persistence 구현을 최상으로 구현하는 데 중요합니다.
EJB 컨테이너 외부에서 Java Persistence 구현을 사용할 경우 캐시 설정 및 연결 풀 설정이 구현 성능에서 다시 중요한 역할을 수행합니다. 그러나 이 경우 persistence.xml 파일에서 연결 풀 값을 설정합니다.
Java Persistence 구현 성능에 중요한 다른 매개변수도 있습니다. 하나가 문 캐시입니다. 이것은 Oracle 데이터베이스와 같은 일부 데이터베이스에 대해 명시적으로 설정해야 합니다. 문 캐시는 GlassFish와 번들로 제공되는 Java DB 데이터베이스에서 기본값으로 조정됩니다.
그리고 JVM(Java Virtual Machine)* 설정은 성능 조정에서 중요한 역할을 수행할 수 있습니다. JVM 조정에 대한 자세한 내용은 Java Tuning White Paper를 참조하십시오. 이 팁의 애플리케이션을 실행할 경우 JVM 옵션은 다음 값으로 설정되었습니다.
-server -XX:+AggressiveHeap -Xmx2500m -Xms2500m -Xss128k -XX:+DisableExplicitGC
* 이 문서에 사용된 대로 "Java virtual machine" 또는 "JVM" 용어는 Java 플랫폼의 가상 시스템을 의미합니다.
자세한 정보
Java Persistence에 대한 자세한 내용은 The Java Persistence API - A Simpler Programming Model for Entity Persistence 및 Java Persistence API FAQ를 참조하십시오.
Toplink Essentials에 대한 자세한 내용은 TopLink Essentials - The Java Persistence API Implementation at GlassFish를 참조하십시오.
샘플 코드 실행하기
이 탭과 함께 제공되는 샘플 코드를 설치하고 실행하려면 다음 단계를 수행하십시오.
- 아직 수행하지 않았으면 GlassFish Community Downloads 페이지에서 GlassFish를 다운로드하고 설치하십시오.
- 다음 환경 변수를 설정하십시오.
GLASSFISH_HOME. 이 변수는 GlassFish의 설치 위치를 가리켜야 합니다.ANT_HOME. 이 변수는 ant의 설치 위치를 가리켜야 합니다. Ant는 다운로드한 GlassFish 번들에 포함되어 있습니다. (Windows에서는 lib\ant 하위 디렉토리에 있음)JAVA_HOME. 이 변수는 사용자 시스템의 JDK 5.0 위치를 가리켜야 합니다.
$JAVA_HOME/bin,$ANT_HOME/bin및$GLASSFISH_HOME/bin을 사용자의 PATH 환경 변수에 추가하십시오. - 샘플 패키지를 다운로드하고 해당 컨텐츠의 압축을 푸십시오. 이제 압축이 풀린 디렉토리가
<sample_install_dir>/ttmay2007JPAper과 같이 나타납니다. 여기서<sample_install_dir>는 샘플 패키지를 설치한 디렉토리입니다.ttmay2007JPAper아래의 샘플 디렉토리에는 샘플에 대한 소스 파일과 기타 지원 파일이 있습니다.
- samples/bp-project 디렉토리로 바꾸고 build.properties 파일을 적절하게 편집하십시오. 예를 들어, admin 호스트가 원격인 경우 기본값(localhost)에서 admin.host 값을 적절한 원격 호스트로 변경하십시오.
javaee.server.passwordfile위치가 정확한지도 확인하십시오.
- GlassFish를 시작하십시오.
$GLASSFISH_HOME/bin/asadmin start-domain domain1
- samples/javaee5/enterprise/customer-cmp-ear 디렉토리로 변경하고 다음 명령을 입력하십시오.
ant start-db
- samples/javaee5/enterprise/customer-cmp-ear/setup 디렉토리로 변경하고 다음 명령을 입력하십시오.
ant create-dbant setup  Âant generate-dataant configure-glassfish
- 벤치마크 드라이버를 다양한 모드에서 실행하려면 samples/javaee5/enterprise/customer-cmp-ear/customer-cmp-driver 디렉토리로 변경하고 다음 명령을 실행하십시오.
In-container mode, non-optimized: ant run_inc_defaultIn-container mode, optimized: ant run_inc_optimizedOut-of-container mode, non-optimized: ant run_ooc_defaultOut-of-container mode, optimized: ant run_ooc_optimized
각 실행의 출력은 samples/javaee5/enterprise/customer-cmp-ear/customer-cmp-driver/output/${runid} 디렉토리에 저장됩니다. 여기서
${runid}는 실행하는 동안 콘솔에 표시되는 각 실행의 ID입니다. 결과를 보려면 해당 디렉토리에서 summary.xml 파일을 확인하십시오.실행이 완료된 후에 조정 설정을 실행 취소할 수 있습니다. samples/javaee5/enterprise/customer-cmp-ear/setup 디렉토리로 변경하고 다음 명령을 입력하십시오.
ant unconfigure_glassfish.
저자 정보
Rahul Biswas는 썬에서 Java Performance Engineering 그룹의 멤버로서, 현재 GlassFish에서 Persistence 구현의 성능 향상을 위해 노력하고 있습니다.
이 테크팁의 영문 원본 :
http://java.sun.com/mailers/techtips/en ··· html%231
웹 애플리케이션에서 주석 사용하기 팁은 NetBeans IDE 및 Java EE 5 SDK를 사용하여 개발되었습니다. NetBeans IDE 5.5(NetBeans Enterprise Pack 5.5 포함)는 Java EE 5 SDK Update 2에서 사용 가능하며 Java EE Downloads 페이지에서 다운로드할 수 있습니다.
JPA를 최상으로 구현하는 방법 팁은 GlassFish라는 Java EE 5의 오픈 소스 참조 구현을 사용하여 개발되었습니다. GlassFish Community Downloads 페이지에서 GlassFish를 다운로드할 수 있습니다.
웹 애플리케이션에서 주석 사용하기 팁에 대한 샘플 아카이브를 다운로드할 수 있습니다.
JPA를 최상으로 구현하는 방법 팁에 대한 샘플 아카이브를 다운로드할 수 있습니다.
위에 있는 이 코드 및/또는 정보의 사용은 라이센스 계약 조건에 따릅니다.
"Java EE" 카테고리의 다른 글
- JAX-WS 핸들러 구성, 패키징, 배치하기 (댓글 2개 / 트랙백 0개) 2006/10/19
- Enterprise Bean에서 보안 주석 사용하기 (댓글 4개 / 트랙백 0개) 2007/05/28
- 엔터프라이즈용 Java Application Verification Kit, 2부 (댓글 1개 / 트랙백 0개) 2005/10/05
- Java Persistence를 최상으로 구현하는 방법 (댓글 12개 / 트랙백 0개) 2007/07/23
- SAAJ 소개 (댓글 1개 / 트랙백 0개) 2005/06/08
- 커스텀 ELResolver를 이용하여 통합 EL 확장하기 (댓글 4개 / 트랙백 0개) 2006/10/19
- JAX-WS를 이용한 웹 서비스 개발 (댓글 1개 / 트랙백 0개) 2006/01/18
- JAXR (JAVA API FOR XML REGISTRIES) (댓글 1개 / 트랙백 0개) 2005/05/18
- GlassFish에서 호출 흐름 모니터링하기 (댓글 3개 / 트랙백 0개) 2006/06/16
- Groovy, Grails, MySQL 및 Java Persistence API의 조합 (댓글 0개 / 트랙백 0개) 2008/08/20
댓글을 달아 주세요
자바의 세상으로 우리 함께 여행해요
2007/09/06 10:02좋은정보 감사드려요!!!
정보 감사합니다 ^^
2007/09/10 14:02좋은 내용 감사드립니다. ^^
2007/09/13 10:49자바는 알면 알수록 재미가 있어지네요. 좋은 자료 잘 활용하겠습니다.
2007/09/13 22:40Java Persistence에 대해 간략하면서도 자세하게 쓰여져서 도움이 많이 됐습니다. 앞으로도 종종 방문해서 도움도 받고, 어느정도 실력이 쌓이면 저도 한번 참여했으면 좋겠네요.
2007/09/17 09:26좋은 정보 감사해요~
2007/09/19 03:24좋은자료 많이 많이 올려주세요..감사
2007/09/19 06:45유용한 자료,감사합니다
2007/09/19 13:26하나하나 알아가는재미가 점점 생겨서 좋습니다.
2007/09/19 19:22직접적인 개발자가 아니라서 정확한 세부사항까지 이해하기는 어려웠지만 나름 좋은 지식공유가 된것 같아서 기쁘네요... 앞으로도 좋은 지식발견이 되었으면 좋겠습니다. 감사합니다...!
2007/09/19 21:09많이 배우고 갑니다.
2007/09/19 22:40감사합니다.
어려운 내용이지만 공부 하면 좋은 내용이 될 것 같아요 _
2007/09/20 01:33