메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

pureQuery를 사용하여 Hibernate와 iBATIS 애플리케이션 성능 개선하기, Part1 : IBM Integration Module for pureQuery and Hibernate 사용하기

새 IBM Integration Module을 이용하여 정적 SQL과 이기종 일괄처리 기능 사용하기

Sandhya Turaga, Software Engineer, IBM
Sandhya Turaga photo
Sandhya Turaga is a Software Engineer in the object query development team at IBM Silicon Valley Lab. Previously, while working as an intern at IBM, she worked on query performance improvement for ObjectGrid's object query language. She graduated with an MS in Computer Science from San Jose State University in May 2008, where her thesis work was on Grid computing.
Abhigyan Agrawal, Software Engineer, IBM
Abhigyan Agrawal photo
Abhigyan Agrawal is a Software Engineer on the Open Source Team at IBM India Software Labs. Currently he is working on providing DB2 Static SQL support for Hibernate. Previously, he worked on providing DB2 Static SQL support in iBATIS and developing the IBM Python drivers. He graduated with an MTech in Information Technology from IIIT, Bangalore.
Kathy Zeidenstein, Senior Software Engineer, IBM
Author Photo: Kathy Zeidenstein
Kathy Zeidenstein has worked at IBM for a bazillion years. She has worked in Information Development, product management, and product marketing. Currently, she is the manager responsible for Information Development for Optim solutions for database development, administration, and design. Previously, she worked on the IBM Optim Solutions technical enablement team and was responsible for community development and communications.
Mario Briggs, Senior Software Engineer, IBM
Mario  Briggs photo
Mario Briggs leads the Open Source offerings for IBM DB2 and IBM Informix including PHP, Ruby/Rails, Python/Django/SqlAlchemy, Perl, and Java data access frameworks. Mario has about 11 years of experience in Software development with many of those years spent in the area of data access, relational engines, and application-database performance.

요약:  IBM Optim® pureQuery Runtime을 다운로드 가능한 IBM® Integration Module을 사용하여 확장하면 Hibernate와 iBATIS 애플리케이션용 DB2 정적 SQL을 생성하는 프로세스가 단순화됩니다. 이 과정에서 개발자가 애플리케이션 코드를 변경하거나 제품 워크로드에서 SQL을 수집할 필요가 없습니다. 또한, Optim pureQuery Runtime을 이용하면 Hibernate와 iBATIS 애플리케이션에서 DB2나 Informix®를 액세스하여 pureQuery의 이기종 일괄처리 기능으로부터 혜택을 얻을 수 있습니다. 개발자는 요청이 다수의 테이블을 참조하는 경우에도 네트워크를 통해 요청을 전송하기 전에 이기종 일괄처리 기능을 사용하여 다수의 INSERT, UPDATEDELETE 요청을 처리할 수 있습니다. 이 기사는 두 파트로 구성된 시리즈 기사 중 첫 번째 파트이다. Part 1에서는 IBM Integration Module을 Hibernate 애플리케이션과 함께 사용하는 방법을 설명합니다. Part 2에서는 iBATIS 애플리케이션을 집중적으로 살펴봅니다. 이 기사에는 이러한 두 가지 기능을 쉽게 사용할 수 있게 하는 방법을 확인할 수 있는 다운로드 가능한 샘플 애플리케이션이 포함되어 있습니다. 또한, 이 기사에서는 비공식적인 경과 시간 성능 측정치를 제공합니다.

이 연재 자세히 보기

원문 게재일:  2010 년 8 월 12 일 번역 게재일:   2011 년 3 월 22 일
난이도:  중급 원문:  보기 PDF:  A4 and Letter (359KB | 31 pages)Get Adobe® Reader®
페이지뷰:  2579 회
의견:  


개요

pureQuery는 개발 도구, Java® API, 런타임 및 모니터링 서비스로 구성된 고성능 데이터 액세스 플랫폼이다. 경량 pureQuery API를 사용하면 DB2, Informix 및 Oracle 데이터베이스를 액세스하는 데이터 액세스 코드를 작성할 수 있다. 그러나 pureQuery에서 이기종 일괄처리 기능과 같은 성능 기능 지원, 생성된 SQL을 가시화하고 수정하는 기능, 데이터베이스 액세스 우수 사례의 사용, 쿼리를 통해 성능 데이터를 수집하는 기능과 같은 다양한 혜택을 얻기 위해 API를 사용할 필요는 없다. pureQuery에 관한 자세한 정보는 참고자료 섹션을 참조한다.

pureQuery를 기존 애플리케이션과 함께 사용하는 것과 관련된 주요 유스 케이스는 DB2 데이터베이스 서버와 관련된 것이며 이런 경우에는 개발자가 SQL 실행 모드를 동적 실행(Java 애플리케이션 기본값)에서 정적 실행으로 변환할 수 있다. 이렇게 하면 런타임 시에 준비하지 않아도 되고 SQL 주입 위험을 제거할 수 있다. 정적 실행을 통해 얻을 수 있는 혜택에 관한 자세한 정보는 참고자료 섹션을 참조한다.

또한, pureQuery를 사용하면 생성된 SQL 문을 원본 Java 소스 코드와 연관시키고 성능 지표를 가시화하는 것과 같은 Optim Development Studio 기능을 이용할 수 있다. 이 때문에 pureQuery를 Informix와 Oracle 데이터베이스를 액세스하는 기존 애플리케이션과 함께 사용하는 것이 유용하다. 그림 1은 Optim Development Studio의 스냅샷으로 주요 기능이 일부 강조되어 있다.


그림 1. Optim Development Studio 아웃라인 뷰
데이터베이스 탭에서 스키마에 있는 참조 테이블과 Java 소스 코드에 있는 쿼리 간의 상관을 표시하는 스냅샷. 또한, 명령문의 성능 지표가 데이터베이스 탭에 표시되어 있다.

Optim Development Studio에서 얻을 수 있는 혜택에 관한 자세한 정보는 참고자료 섹션을 참조한다.

pureQuery API로 작성되지 않은 기존 애플리케이션에서 pureQuery를 이용할 수 있는 방법은 두 가지가 있다. 이러한 방법은 개별적으로 사용하거나 함께 사용할 수 있다.

  • 클라이언트 최적화를 사용하여 Java 프로그램이 실행되고 있는 동안 Optim pureQuery Runtime이 SQL과 관련 성능 및 애플리케이션 메타데이터를 캡처하도록 한다. 이 방법은 유연하기 때문에 패키지된 애플리케이션을 포함한 모든 Java 애플리케이션을 대상으로 사용할 수 있다. 그러나 이 방법을 사용하려면 추가 설정 작업이 일부 필요하며 코드에서 다양한 경로를 실행하여 모든 SQL이 캡처되었는지 확인해야 한다. SQL을 캡처한 후에는 Optim Development Studio의 전체 기능을 사용하여 SQL을 수정하고, 액세스 경로를 가시화하고, 성능 테스트와 영향 분석을 수행할 수 있다. 참고자료 섹션에는 클라이언트 최적화를 사용하는 방법이 기술된 튜토리얼의 링크가 포함되어 있다.
  • 프로그램이 초기 캡처 단계를 수행하지 않아도 pureQuery와 Optim Development Studio의 전체 기능을 활용할 수 있도록 IBM Integration Module을 사용한다. 이 방법은 새로운 것이며 이 기사 시리즈에서는 이 방법을 집중적으로 살펴본다. 이 방식에서는 Hibernate/iBATIS 프로그램을 실행하기 전에 IBM Integration Module이 SQL과 메타데이터를 추출한다. 이러한 기능은 이전에는 WebSphere® OpenJPA에서 사용할 수 있었다. (이 주제와 관련된 기사의 링크는 참고자료 섹션을 참조한다.) 현재는 새로운 IBM Integration Module을 사용하면 Hibernate와 iBATIS 애플리케이션에서 이 기능을 사용할 수 있다. 이러한 모듈을 사용함으로써 런타임 캡처를 수행하지 않아도 SQL을 시각화하고 최적화할 수 있는 도구를 사용할 수 있다. (또한, 증분식 캡처를 사용하여 기준 쿼리 수집 섹션에서 기술된 바와 같이 캡처를 하면서 이러한 도구를 사용할 수 있다.)

IBM Integration Module for pureQuery and Hibernate를 이용하면 Hibernate 애플리케이션에서 다음과 같은 혜택을 얻을 수 있다.

  • Hibernate 애플리케이션에서 정적 SQL을 사용할 수 있으며 초기 pureQuery 클라이언트 최적화 캡처가 필요없다. IBM Integration Module은 Hibernate 애플리케이션에서 사용하는 SQL을 생성한다. 이 SQL은 DB2 데이터베이스에 액세스하기 위한 목적으로 정적으로 바인드할 수 있고 애플리케이션 자체를 변경하지 않고도 검토, 공유, 최적화하고 변경할 수 있다. 또한, 이 SQL을 애플리케이션 코드와 연관시켜서 Hibernate 소스 코드로 돌아가 성능 문제를 추적하거나 데이터베이스 오브젝트 변경 사항과 연관시켜서 Optim Development Studio를 사용하여 영향을 분석할 수 있다.
  • Hibernate 애플리케이션에서 pureQuery의 이기종 일괄처리 기능을 사용할 수 있다. 이 기능을 이용하면 다수의 INSERT, UPDATEDELETE 요청이 여러 가지 테이블을 참조하는 경우에도 이러한 요청을 일괄처리할 수 있다. 예를 들면, 오브젝트를 구성하는 여러 개의 데이터베이스 테이블을 업데이트 해야 하는 직원 오브젝트를 업데이트하는 작업은 다수의 트립이 필요 없으며 데이터베이스에 대한 하나의 트립만으로 수행할 수 있다. 데이터베이스 서버에 대한 각 네트워크 라운드 트립은 성능 면에서 보면 그 대가가 많이 들어간다. 따라서 라운드 트립이 적고 일괄처리 용량이 클수록 성능은 더욱 향상된다. 이 기능은 DB2와 Informix 데이터베이스를 대상으로 사용할 수 있다.

이 기사에서는 Integration Module for Hibernate and pureQuery를 설정하고 사용하는 방법을 설명한다. 먼저, IBM Integration Module의 정적 SQL 기능을 설명한 다음, 이기종 일괄처리 기능을 설명한다. 이 기사에서는 독자가 Hibernate에 관해 약간의 지식이 있으며 Hibernate 3.2 이상을 사용하고 있다고 가정한다. 개발자는 애플리케이션 코드를 변경하지 않고도 IBM Integration Module에서 제공하는 혜택을 활용할 수 있다.

정적 SQL은 무엇이고 성능에 어떠한 도움을 줄 수 있나?

DB2의 정적 SQL은 개발자가 런타임 시에 데이터 액세스를 효율화할 수 있는 강력한 기능이다. DB2는 데이터베이스 액세스 경로 판별과 같은 일부 작업을 수행 시간 이전에 수행함으로써 이러한 기능을 수행한다. 이렇게 하면 런타임을 더욱 신속하고 일관된 방법으로 수행할 수 있다. 그림 2에는 동적 SQL과 정적 SQL을 실행하는 과정이 비교되어 있다.


그림 2. 정적 SQL과 동적 SQL의 실행 과정 비교
정적 SQL 플로우 차트가 단지 세 단계로 구성된데 반해 동적 SQL 플로우 차트는 여섯 단계로 구성됨

또한, 정적 SQL과 동적 SQL은 보안 모델이 서로 다르다. 정적 SQL을 사용하는 경우에는 사용자가 패키지라고 하는 바인드 프로세스의 결과를 실행할 수 있는 권한만을 받는다. 이 패키지에는 SQL 문이 포함되어 있다. 따라서 테이블에 액세스하는 모든 과정은 정적이며 개발자는 전체 테이블이나 뷰가 아니라 패키지에 액세스할 수 있는 권한만 부여하면 된다. 또한, 정적 SQL을 사용하면 잘 알려진 동적 SQL의 보안 문제인 악성 주입이 발생할 기회를 줄일 수 있다.

정적 SQL에 관한 자세한 정보는 참고자료 섹션을 참조한다.


Integration Module for Hibernate and pureQuery를 사용하여 정적 SQL 작성하기 개요

이 섹션에서는 Hibernate 애플리케이션을 기본값으로 실행(동적 SQL)한 것과 IBM Integration Module을 사용하여 정적 SQL을 작성하여 사용하는 것을 비교한다.

Hibernate에서 동적 SQL 실행: JDBC

그림 3에는 IBM Integration Module을 사용하지 않는 상태에서 상위 레벨에서 Hibernate 애플리케이션을 실행하는 과정이 표시되어 있다. Hibernate는 SQL 문 문자열을 생성하고 JDBC 준비 및 실행 오퍼레이션을 사용하여 해당 데이터베이스를 대상으로 이 SQL 문을 실행한다.


그림 3. IBM Integration Module을 사용하지 않는 상태에서 Hibernate 애플리케이션에서 동적 SQL 실행
Hibernate 애플리케이션은 SQL 문자열을 생성한 다음, JDBC 드라이버와 데이터베이스로 차례로 이동한다.

IBM Integration Module(pureQuery)을 사용하여 Hibernate 애플리케이션에서 정적 SQL 실행

그림 4에는 IBM Integration Module을 사용하여 상위 레벨에서 Hibernate 애플리케이션을 실행하는 과정이 표시되어 있다. 정적 SQL을 실행하기 위해 DB2 패키지가 작성되었다. 그림 4는 다음과 같은 과정을 묘사한다.

  • SQL 생성 단계(HibernateGen)에서는 Hibernate 애플리케이션에서 사용하는 모든 SQL 문을 수집하여 pureQuery XML 파일에 삽입한다. (이 파일의 파일 유형은 .pdqxml이다.) 그러면 이 파일을 Optim Development Studio에서 사용하여 바인드 단계를 거치지 않고도 성능 조정이나 영향 분석을 할 수 있다. pureQuery XML 캡처 파일은 정적 바인더를 사용하여 정적 패키지에 바인드할 수 있다.
  • 애플리케이션이 실행되는 동안 pureQuery 런타임은 JDBC 호출 경로를 재지정하여 생성 단계에서 작성된 DB2 정적 패키지를 실행한다. pdq.properties 파일은 pureQuery 런타임 실행 동작(동적 또는 정적)을 제어하고 pureQuery XML 파일의 위치를 제공한다.

그림 4. IBM Integration Module을 사용하여 Hibernate 애플리케이션에서 정적 SQL 실행
HibernateGen은 pdqxml을 작성하며 pdqxml은 DB2의 정적 패키지를 작성한다. pureQuery는 JDBC 호출 경로를 재지정하여 정적 패키지를 실행한다.

Hibernate 애플리케이션을 사용하여 어떤 SQL 문을 추출할 수 있나?

IBM Integration Module을 통해 추출할 수 있는 SQL 문은 다음과 같다.

  • 이름 지정 쿼리용 SQL — JPQL(Java Persistence Query Language) 및 HQL(Hibernate Query Language)
  • 이름 지정 원시 쿼리용 SQL — 이름 지정 SQL 쿼리, JPA(Java Persistence API) 및 지정된 Hibernate API
  • Hibernate 빈즈/엔티티에 대한 CRUD(Create, Read, Update and Delete) 오퍼레이션용 SQL — JPA 및 원시 API
  • Hibernate 빈즈/엔티티의 콜렉션에 대한 CRUD 오퍼레이션용 SQL — JPA 및 원시 API

기준 쿼리용 SQL과 인라인 쿼리용 SQL은 IBM Integration Module에서 생성되지 않는다. HQL 쿼리가 정확하게 동적 쿼리가 아니면 Java 코드에 HQL 쿼리를 임베드하지 말아야 한다. 이러한 경우에는 정적 SQL을 해당 쿼리에 적용할 수 없다. HQL 쿼리의 구체화와 관련된 정보는 참고자료 섹션을 참조한다.


이기종 일괄처리 기능은 무엇이고 이것을 통해 어떻게 성능을 개선할 수 있나?

Hibernate는 JDBC를 사용하여 데이터를 액세스한다. JDBC는 동종 일괄처리라고 하는 일괄처리 형식을 지원한다. 이 일괄처리 형식은 단일 테이블에 국한되며 명령문에 입력 매개변수가 있으면 동일한 SQL 문을 여러 번 실행한다. 그러나 트랜잭션에서 다중 엔티티 유형을 업데이트하거나 2차 테이블과 관련된 엔티티 맵핑을 사용하는 경우에는 상속이나 Table-per-class 상속을 결합하며 트랜잭션에는 다수의 테이블과 관련된 여러 개의 SQL 문이 포함될 수 있다. 따라서 이러한 경우에는 JDBC 일괄처리 기능이 효과적이지 않다.

이외에도 JDBC 일괄처리 기능은 SQL 문에 입력 매개변수가 없는 경우에 다양한 SQL 문을 일괄처리에 추가할 수 있는 기능만을 지원한다. 그러나 Hibernate나 OpenJPA를 사용하는 일반적인 애플리케이션은 애플리케이션의 동적 특성으로 인해 SQL 문을 입력 매개변수와 함께 사용한다. 이러한 경우에는 JDBC 일괄처리 기능을 통해 다양한 SQL 문을 일괄처리할 수 없다.

Listing 1에 표시된 것과 같은 일괄처리 시나리오를 생각해보자.


Listing 1. 일괄처리 시나리오

PreparedStatement pstmt = conn.prepareStatement("update T1 set name=? where id=?");
pstmt.setString(1,"name1");
pstmt.setInt(2,1);
pstmt.addBatch();

pstmt.setString(2,"name2");
pstmt.setInt(2,2);
pstmt.addBatch();

pstmt.executeBatch();

delete from T1 where ID = ? SQL 문을 Listing 1에 표시된 일괄처리에 추가할 수는 없다. 그 대신 또 다른 preparedStatement를 작성하여 삭제를 처리하고 또 다른 메시지를 데이터베이스 서버에 전송하여 삭제 쿼리 명령문을 준비한다.

pureQuery에서 사용 가능한 이기종 일괄처리 기능을 사용하여 JDBC 일괄처리 작업으로 처리하지 못하는 상황에서의 성능을 개선할 수 있다. 예를 들어, Listing 1에 있는 시나리오를 다시 살펴보자. pureQuery를 사용하면 Listing 2에 있는 SQL 문을 동일한 pureQuery 일괄처리에 추가할 수 있다. 그러면 pureQuery가 SQL 문을 준비하는 과정을 처리하여 하나의 메시지로 이러한 모든 SQL 문을 데이터베이스 서버에 전송한다. 이렇게 하면 성능을 개선할 수 있다.


Listing 2. 이기종 일괄처리 기능

update T1 set name=? where id=?
delete from T1 where ID = ?

표 1에는 pureQuery 이기종 일괄처리를 활용할 수 있는 프로그램의 일부 특성이 요약되어 있다.


표 1. pureQuery 이기종 일괄처리가 유용한 경우
프로그램 특성JDBC 동종 일괄처리 기능에서의 지원 여부pureQuery 이기종 일괄처리 기능에서의 지원 여부
다수의 테이블에 맵핑되는 엔티티에 대한 업데이트를 일괄처리아니오
같은 테이블에 있는 다른 열을 대상으로 하는 업데이트를 일괄처리아니오(입력 매개변수 대신 리터럴을 사용하지 않는 한)
같은 테이블을 대상으로 다수의 오퍼레이션(INSERT, UPDATE, DELETE)을 일괄처리아니오(입력 매개변수 대신 리터럴을 사용하지 않는 한)
다수의 엔티티를 대상으로 하는 업데이트를 일괄처리아니오(입력 매개변수 대신 리터럴을 사용하지 않는 한)

다음과 같은 시나리오에서는 이기종 일괄처리 기능을 통해 애플리케이션 성능을 개선할 수 없다.

  • 애플리케이션이 SELECT 문으로만 구성되어 있다. 이는 현재 릴리스된 IBM Integration Module의 이기종 일괄처리 기능이 INSERT, UPDATEDELETE 문의 성능만을 개선하기 때문이다.
  • 애플리케이션이 테이블 ID나 데이터베이스 시퀀스 키가 생성된 엔티티를 사용한다.

IBM Integration Module을 사용하는 이기종 일괄처리 인에이블먼트 개요

이 섹션에서는 pureQuery 이기종 일괄처리 기능을 사용하는 Hibernate 애플리케이션과 그렇지 않은 애플리케이션의 실행 결과를 비교한다.

Hibernate에서의 기본 일괄처리: JDBC

그림 5에는 pureQuery 이기종 일괄처리 기능을 사용하지 않는 상태에서의 샘플 Hibernate 애플리케이션의 상위 레벨 실행 플로우가 표시되어 있다. (샘플 애플리케이션은 다운로드 섹션을 통해 얻을 수 있다.) Hibernate는 INSERT, UPDATEDELETE 문 문자열을 생성하여 실행을 위해 클래스 Persister에 전달한다. Persister는 Batcher를 호출하여 JDBC 준비를 수행하고 오퍼레이션을 실행한다.


그림 5. pureQuery 이기종 일괄처리 기능을 사용하지 않는 상태에서 Hibernate 애플리케이션 실행
Hiberntae API는 엔티티 오퍼레이션을 위해 Batcher와 Persister로 이동한다. 그런 다음, jdbc 드라이버와 데이터베이스로 이동한다.

Hibernate에서의 이기종 일괄처리: pureQuery

그림 6에는 pureQuery 이기종 일괄처리 기능을 사용하는 상태에서의 샘플 Hibernate 애플리케이션의 상위 레벨 실행 플로우가 표시되어 있다. Hibernate는 INSERT, UPDATEDELETE 문 문자열을 생성하여 실행을 위해 클래스 Persister에 전달한다.

IBM Integration Module은 Batcher, eventListener 및 Persister 인터페이스를 구현하여 INSERT, UPDATEDELETE SQL 문이 JDBC 대신 pureQuery로 라우트되게 하여 pureQuery 일괄처리 기능을 활용할 수 있게 한다. 트랜잭션에서 모든 SQL 문이 일괄처리에 추가되면 FlushListener는 일괄처리를 실행하도록 Batcher에게 알린다. 현재, IBM Integration Module에서는 SELECT 문의 이기종 일괄처리 기능을 지원하지 않으므로 SELECT 문은 사용자 정의 Batcher와 Persister를 통과하지 않는다.


그림 6 pureQuery 이기종 일괄처리 기능을 사용하는 상태에서의 Hibernate 애플리케이션의 실행
오퍼레이션은 사용자 정의 리스너, Batcher 및 Persister를 거쳐 pureQuery 런타임, sqlj 및 jdbc 데이터 서버 드라이버, 데이터베이스로 이동한다.

IBM Integration Module for pureQuery and Hibernate를 사용하는 데 필요한 선수조건

참고자료 섹션에는 IBM Integration Module for pureQuery and Hibernate를 다운로드하는 데 사용할 수 있는 링크가 있다.

소프트웨어

pureQuery IBM Integration Module을 사용하려면 다음과 같은 소프트웨어를 설치해야 한다.

  • Optim pureQuery Runtime 2.2.0.3 이상(IBM Optim Development Studio와 Optim pureQuery Runtime 30일 시험판의 다운로드 링크는 참고자료 섹션을 참조한다. Optim pureQuery Runtime은 Optim Development Studio와 같은 시스템에 설치해야 한다.)
  • 클래스 경로에 pdq.jar과 pdqmgmt.jar이 있는지 확인한다.
  • IBM Data Server Driver for JDBC and SQLJ 3.58이나 4.7(Optim Development Studio를 통해 사용하거나 참고자료 섹션의 다운로드 링크를 참조한다.)
  • Hibernate 3.2 이상

IBM Integration Module에는 선수조건을 확인하는 데 사용할 수 있는 유효성 검증기 유틸리티가 포함되어 있다. 이 유틸리티를 사용하는 방법과 관련된 지시사항은 유효성 검증기 유틸리티를 사용하여 선수조건 확인 섹션을 참조한다.

지원 데이터베이스

IBM Integration Module for pureQuery and Hibernate는 애플리케이션이 다음과 같은 데이터베이스 시스템에 액세스할 때 작동한다.

  • DB2 for Linux®, UNIX®, and Windows® V8.2, 수정팩 11 이상
  • DB2 for Linux, UNIX, and Windows V9.1, V9.5 또는 V9.7
  • DB2 for i V5R4(이기종 일괄처리 기능 전용)
  • DB2 for z/OS® V8 이상
  • Informix Dynamic Server V11.10 또는 V11.5(이기종 일괄처리 기능 전용)

이 기사에서 사용한 샘플 애플리케이션

다운로드 섹션에 있는 DemoHibApp.zip 파일에는 Hibernate 3.2 이상을 사용하는 경우에 이 기능을 시도하기 위해 사용할 수 있는 샘플 애플리케이션이 있다.


Hibernate 애플리케이션에 pureQuery 정적 SQL 사용

이 섹션에서는 샘플 Hibernate 애플리케이션을 사용하여 IBM Integration Module에서 정적 SQL이 어떻게 처리되는지 설명한다.

persistence.xml에서 Provider를 편집한다.

persistence.xml을 사용하는 경우, pureQuery 정적 SQL 지원을 사용하려면 persistence.xml에 Provider 특성을 지정해야 한다.

샘플 애플리케이션에서는 이미 이 특성이 Listing 3의 첫째 줄에 표시된 바와 같이 설정되어 있다.


Listing 3. pureQuery 정적 SQL을 사용하는 데 필요한 persistence.xml의 필수 특성

<provider>com.ibm.pdq.hibernate3.PDQHibernatePersistence</provider>
<!-- <provider>org.hibernate.ejb.HibernatePersistence</provider> -->

hibernate.cfg.xml을 사용할 경우에는 이 파일을 변경할 필요가 없다.

Hibernate와 함께 정적 SQL을 사용하기 위해 Provider를 변경해야 하는 이유는?

정적 SQL을 사용하려면 Hibernate에서 생성된 SQL 문자열이 매번 정확히 동일해야 한다. Hibernate에는 애플리케이션을 실행할 때마다 동일한 SQL이 생성되지만 열 별명이 달라지는 문제점이 있다. (세부사항은 Hibernate 웹 사이트의 포럼 게시물(how are column alias names generated)을 참조한다.)

정적 SQL을 사용하려면 다음과 같은 방법 중 하나를 사용하여 이 문제를 해결해야 한다.

  • Hibernate에 Hibernate Defect HHH-2448 패치를 적용한다.
  • IBM Integration Module에서 제공하는 구성 클래스를 사용한다.

클래스 경로 구성

샘플 애플리케이션은 Hibernate 3.2, Hibernate 엔티티 관리자 및 Hibernate 어노테이션을 사용한다. 그러므로 샘플 애플리케이션을 컴파일하려면 클래스 경로에 다음과 같은 jar 파일이 Hibernate에 필요한 다른 jar 파일과 함께 있어야 한다.

  • hibernate3.jar
  • hibernate-entitymanager.jar
  • hibernate-annotations.jar
  • hibernate-common-annotations.jar
  • ejb3-persistence.jar
  • dom4j-1.6.1.jar
  • log4j-1.2.15.jar
  • javassist-3.4.GA.jar
  • antlr-2.7.6.jar
  • commons-collections-3.1.jar
  • slf4j-api-1.5.2.jar
  • slf4j-log4j12-1.5.2.jar
  • commons-logging-1.0.4.jar
  • pdq-hibernate3.2.jar(IBM Integration Module과 함께 제공됨)

또한, IBM Integration Module을 사용하려면 클래스 경로에 다음과 같은 jar 파일이 있어야 한다.

  • pdq.jar
  • pdqmgmt.jar
  • The db2jcc jars

versionValidator 유틸리티를 사용하여 선수조건 확인

IBM Integration Module에는 클래스 경로를 검사하여 Hibernate, JDBC Driver 및 pureQuery Runtime의 버전(선수조건)을 확인하는 versionValidator라는 프로그램이 포함되어 있다. Listing 4에는 이 프로그램을 실행하는 명령이 표시되어 있다.


Listing 4. versionValidator 프로그램을 실행하는 명령


java  com.ibm.pdq.hibernate3.utility.VersionValidator

클래스 경로에 포함된 jar 파일의 레벨이 올바르면, versionValidator 프로그램은 Listing 5에 있는 것과 비슷한 메시지를 표시한다.


Listing 5. 선수조건이 올바를 때의 versionValidator 프로그램의 출력

>set CLASSPATH=./pdq.jar;./pdqmgmt.jar;./hibernate3.jar;./db2jcc.jar;./pdqhibernate3.jar;

>java    com.ibm.pdq.hibernate3.utility.VersionValidator

IBM integration module version: 2.2.0.3

Hibernate version: 3.3.1.GA

Found pdqmgmt.jar

PDQ runtime version: 2.18.121

IBM DB2 JDBC Universal Driver: 3.53

java version: 1.5.0_13

클래스 경로에 포함된 jar 파일 중 일부의 레벨이 올바르지 않은 경우, versionValidator 프로그램은 적절한 오류 메시지를 표시한다. 예를 들면, Listing 6에 있는 메시지는 IBM Integration Module과 함께 작동하기에는 DB2 JDBC 드라이버의 레벨이 올바르지 않음을 나타낸다.


Listing 6. 선수조건이 올바르지 않은 경우의 versionValidator 프로그램의 출력

Hibernate version: 3.3.1.GA

Found pdqmgmt.jar

PDQ runtime version: 2.1.70

Found IBM DB2 JDBC Universal Driver version: 2.3 **** ERROR. Incorrect level. Requires 
        V3.53 or higher

java version: 1.5.0_13

샘플 애플리케이션의 데이터베이스 준비

다음 단계를 따라 샘플 애플리케이션의 데이터베이스를 준비한다.

  1. 이름이 demodb인 데이터베이스를 작성한다. Hibernate가 필요한 테이블을 자동으로 작성한다.
  2. DemoHibApp.zip 파일의 압축을 풀고 샘플 애플리케이션을 Java 프로젝트로서 Optim Development Studio 작업공간으로 가져온다.
  3. 클래스 경로 구성에 표시된 것과 동일한 jar 파일을 프로젝트 빌드 경로에 삽입한다. 해당 프로젝트를 마우스 오른쪽 단추로 클릭하고 pureQuery > Add pureQuery support...를 선택하여 프로젝트 빌드 경로에 pureQuery와 IBM Data Server for JDBC and SQLJ jar 파일을 추가할 수 있다.

샘플 애플리케이션은 다음과 같은 엔티티를 사용한다.

  • Customer가 서브클래스인 CustomerInfo
  • District
  • Item
  • Order

pureQuery XML 파일을 생성하여 정적 SQL을 실행한다.

HibernateGen 명령을 사용하여 샘플 애플리케이션에 필요한 test.pdqxml 파일을 생성한다. 이 명령을 수행하는 데 필요한 일괄처리 파일(HibernateGen.bat)은 IBM Integration Module과 함께 제공된다. 해당 클래스 경로에는 Hibernate에 필요한 모든 jar 파일과 다음과 같은 파일이 함께 있어야 한다.

  • pdq-hibernate3.3.jar
  • pdq.jar
  • pdqmgmt.jar and db2jcc.jar

Listing 7에는 persistence.xml을 사용하는 경우에 필수 jar 파일을 삽입하고 HibernateGen 명령을 실행할 클래스 경로를 설정하는 명령이 표시되어 있다.


Listing 7. persistence.xml을 사용하는 경우에 HibernateGen 명령을 사용하여 pdqxml 생성하기

> set CLASSPATH=./pdq.jar;./pdqmgmt.jar; ./db2jcc.jar;./pdq-hibernate3.3.jar;
./hibernate3.jar;./hibernate-entitymanager.jar;./hibernate-annotations.jar;
./hibernate-common-annotations.jar;./ejb3-persistence.jar;./dom4j-1.6.1.jar;
./log4j-1.2.15.jar;./javassist-3.4.GA.jar;./antlr-2.7.6.jar;
./commons-collections-3.1.jar;./slf4j-api-1.5.2.jar;./slf4j-log4j12-1.5.2.jar;
./commons-logging-1.0.4.jar;%CLASSPATH%

> HibernateGen -puName test

hibernate.cfg.xml을 사용하는 경우에는 Listing 8에 있는 명령을 사용하여 클래스 경로를 설정하고 HibernateGen 명령을 실행한다.


Listing 8. hibernate.cfg.xml을 사용하는 경우에 HibernateGen을 사용하여 pdqxml 파일 생성하기

> set CLASSPATH=./pdq.jar;./pdqmgmt.jar; ./db2jcc.jar;./pdq-hibernate3.3.jar;
./hibernate3.jar;./hibernate-entitymanager.jar;./hibernate-annotations.jar;
./hibernate-common-annotations.jar;./ejb3-persistence.jar;./dom4j-1.6.1.jar;
./log4j-1.2.15.jar;./javassist-3.4.GA.jar;./antlr-2.7.6.jar;
./commons-collections-3.1.jar;./slf4j-api-1.5.2.jar;./slf4j-log4j12-1.5.2.jar;
./commons-logging-1.0.4.jar;%CLASSPATH%

> HibernateGen

HibernateGen 명령이 완료된 후에는 src 디렉토리에 test.pdqxml 파일이 작성되었는지 확인한다.

참고: HibernateGen 명령은 resultsetHoldability에 JDBC 기본값을 사용하여 SQL을 생성한다. 그러나 WebSphere Application Server는 resultsetHoldability에 다른 기본값을 사용한다. WebSphere Application Server에서 Hibernate 애플리케이션을 전개하는 경우에는 WebSphere Application Server 데이터 소스의 resultsetHoldability를 확인하여 Listing 9와 같이 HibernateGen 명령에서 resultsetHoldability를 지정한다.


Listing 9. WebSphere Application Service를 위한 HibernateGen 기본 설정

    > HibernateGen -resultsetHoldability 2
    

HibernateGen 명령과 함께 사용할 수 있는 옵션은 다양하다. 사용 가능한 모든 옵션을 확인하려면 Listing 10과 같이 -help 옵션과 함께 HibernateGen 명령을 실행한다.


Listing 10. HibernateGen 명령 옵션 표시

    > HibernateGen -help

정적 SQL을 실행하기 위한 pureQuery XML 파일의 구성 및 바인드

정적 애플리케이션을 정적으로 실행하려면 먼저 생성된 test.pdqxml 파일을 구성하고 바인드해야 한다. Listing 11과 같이 표준 pureQuery 구성StaticBinder 명령을 사용하여 이러한 작업을 수행한다. StaticBinder 명령을 실행하면 DB2 서버에 패키지가 작성된다. 이러한 명령을 실행할 때는 클래스 경로에 pdq.jar, pdqmgmt.jar 및 해당 JCC 드라이버 jar 파일이 있는지 확인한다. 표준 pureQuery 구성StaticBinder 명령에 관한 자세한 정보는 참고자료 섹션을 참조한다.


Listing 11. pureQuery XML 파일의 구성 및 바인드

> java com.ibm.pdq.tools.Configure -rootPkgName test -pureQueryXml test.pdqxml

> java com.ibm.pdq.tools.StaticBinder

  -url jdbc:db2://localhost:50000/demodb

  -username xx

  -password xx

  -pureQueryXml test.pdqxml

  -traceFile demo_trace.txt

  -traceLevel ALL

정적 SQL을 사용하여 애플리케이션을 실행한다.

Listing 12에는 샘플 애플리케이션과 함께 포함된 pdq.properties 파일에서 사용된 특성이 표시되어 있다.


Listing 12. 샘플 애플리케이션의 pdq.properties 파일

pdq.captureMode=OFF
pdq.executionMode=STATIC
pdq.pureQueryXml=test.pdqxml   

다음은 설정을 설명한다.

  • captureMode=OFF는 캡처가 꺼진 상태임을 나타낸다. 나중에 이 기사에서 살펴볼 클라이언트 최적화 프로세스를 사용하는 경우에만 캡처를 켜야 한다.
  • executionMODE=STATIC은 동적 실행 모드 대신 정적 실행 모드를 사용해야 함을 나타낸다.
  • pureQueryXml=test.pdqxmlHibernateGen 명령을 실행했을 때 작성되는 세 번째 pureQuery XML 파일의 이름과 위치를 제공한다.

모든 pdq 특성에 관한 자세한 정보는 참고자료 섹션을 참조한다.

샘플 애플리케이션에 포함된 실제 pdq.properties 파일의 모든 특성은 주석 처리되어 있다(#으로 시작하는 각 행). 진행하기 전에 파일을 편집하여 # 문자를 삭제하여 세 가지 특성의 주석 처리를 해제한 후, 파일을 저장한다. 이 작업을 완료하면 파일은 Listing 12와 같은 형태가 된다.

persistence.xml을 사용하는 경우에는 이제 MainClient.java를 실행함으로써 샘플 애플리케이션을 실행할 수 있다. Optim Development Studio에서 MainClient.java를 실행하려면 이 파일을 마우스 오른쪽 단추로 클릭한 후, Run As > Java Application을 선택한다. 이 애플리케이션의 SQL 문은 정적으로 실행된다.

hibernate.cfg.xml을 사용하는 경우에는 MainClientSessionFactory.java를 실행함으로써 샘플 애플리케이션을 실행할 수 있다. hibernate.cfg.xml은 Listing 13에 표시된 바와 같이 IBM Integration Module에서 제공하는 구성 모듈을 사용한다는 점에 유의한다. 이 모듈은 Hibernate와 함께 정적 SQL을 사용하기 위해 Provider를 변경해야 하는 이유는? 섹션에서 살펴본 문제점을 해결하는 데 필요하다.


Listing 13. IBM Integration Module에서 제공하는 구성 모듈을 hibernate.cfg.xml 애플리케이션에서 사용하는 방법


public static void main(String[] args) {
	
    _sFactory = new PDQAnnotationConfiguration().configure()
						.buildSessionFactory();

WebSphere Application Server에서 샘플 애플리케이션을 전개하는 경우에는 참고자료 섹션에 있는 웹 애플리케이션 환경에서의 pureQuery 클라이언트 최적화 관련 링크를 참조한다.


Hibernate 애플리케이션에서 pureQuery 이기종 일괄처리 기능 사용하기

persistence.xml에서 특성을 설정한다.

IBM Integration Module을 사용하여 Hibernate 3.2 애플리케이션에서 pureQuery 이기종 일괄처리 기능을 사용하려면 persistence.xml 파일에 다음과 같은 특성을 지정해야 한다.

  • hibernate.jdbc.factory_classcom.ibm.pdq.hibernate3.batcher.PDQBatcherFactory로 설정해야 한다.
  • hibernate.ejb.event.flushcom.ibm.pdq.hibernate3.ejb3.listener.PDQEJB3FlushEventListener로 설정해야 한다.

샘플 애플리케이션에서는 persistence.xml의 설명 섹션에 이러한 특성이 포함되어 있다. 따라서 샘플 애플리케이션의 경우에는 persistence.xml 파일을 간단히 편집하여 이러한 특성의 주석 처리를 해제한 후에 저장할 수 있다. 주석 처리를 해제하면 persistence.xml 파일의 해당 섹션은 Listing 14와 비슷하게 된다.


Listing 14. pureQuery 일괄처리 기능을 사용하는 데 필요한 persistence.xml의 필수 특성

<property name="hibernate.jdbc.factory_class" value = 
"com.ibm.pdq.hibernate3.batcher.PDQBatcherFactory"/>

<property name="hibernate.ejb.event.flush" value = 
"com.ibm.pdq.hibernate3.ejb3.listener.PDQEJB3FlushEventListener"/>

<property name="hibernate.connection.provider_class" value= 
"org.hibernate.connection.C3P0ConnectionProvider"/>

명령문 캐싱 구성

성능을 최적화하기 위해서는 명령문 캐싱을 켜고 캐시를 합당한 크기로 설정해야 한다. Hibernate 애플리케이션은 c3p0 연결 풀링을 사용하여 J2EE 애플리케이션에서의 명령문 캐싱을 활성화할 수 있다. c3P0 명령문 캐싱을 사용하려면 위에 있는 Listing 14에 표시된 바와 같이 persistence.xml 파일에서 hibernate.connection.provider_classorg.hibernate.connection.C3P0ConnectionProvider로 설정한다.

J2EE 애플리케이션에서는 애플리케이션 서버에서 명령문 캐싱을 설정할 수 있다.

c3p0.properties 파일은 Listing 15에 표시된 바와 같이 명령문 캐시의 크기를 지정한다.


Listing 15. c3p0 파일 크기 스펙

c3p0.maxStatementsPerConnection = 200

명령문 캐시 크기로 지정한 크기는 비교적 커야 한다. 일반적으로 캐시 크기는 100 ~ 200 사이가 된다. J2SE 환경에서는 명령문 캐시가 너무 작거나 일괄처리 크기가 너무 크면 명령문 캐시 크기가 불일치하면서 SQL 예외가 발생할 수 있다.

hibernate.cfg.xml 구성

Hibernate 애플리케이션이 원시 Hibernate API를 사용 중인 경우에는 hibernate.cfg.xml 파일에서 다음과 같은 특성을 지정해야 한다.

  • hibernate.jdbc.factory_classcom.ibm.pdq.hibernate3.batcher.PDQBatcherFactory로 설정해야 한다.
  • 플러시 이벤트 리스너 클래스를 com.ibm.pdq.hibernate3.listener.PDQFlushListener로 설정해야 한다.

샘플 애플리케이션에서는 hibernate.cfg.xml의 설명 섹션에 이러한 특성이 포함되어 있다. 따라서 샘플 애플리케이션의 경우에는 hibernate.cfg.xml 파일을 간단히 편집하여 이러한 특성의 주석 처리를 해제한 후에 파일을 저장할 수 있다. 주석 처리를 해제하면 hibernate.cfg.xml 파일의 해당 섹션은 Listing 16과 비슷하게 된다.


Listing 16. pureQuery 일괄처리 기능을 사용하는 데 필요한 hibernate.cfg.xml의 필수 특성

<property name="hibernate.jdbc.factory_class">
     com.ibm.compdq.hibernate3.PDQBatcherFactory</property> 
<event type="flush">
<listener class="com.ibm.pdq.hibernate3.listener.PDQFlushListener"/>
</event>

이기종 일괄처리 기능이 있는 애플리케이션 실행

Listing 17에는 pureQuery 정적 SQL과 이기종 일괄처리 기능을 사용하는 샘플 애플리케이션을 실행하기 위해 구성한 persistence.xml이 표시되어 있다. 이 파일에는 엔티티, 데이터베이스 연결 특성 및 기타 필수 구성 특성이 정의된다.

batch_size 특성은 JDBC 일괄처리의 크기를 제어한다. 또한, 이 특성은 IBM Integration Module에서 pureQuery 일괄처리의 크기를 제어하는 데 사용한다. 일괄처리의 권장 크기는 50 ~ 100 사이이다. 일괄처리 기능을 통해 얻을 수 있는 대부분의 혜택은 일괄처리의 크기가 1 ~ 25 사이에 있을 때이다. 일괄처리의 크기가 너무 크면 SQL 코드 -805의 SQL 예외가 발생할 수 있다. 이는 데이터베이스 서버에서 동적 커서가 고갈되었다는 것을 의미한다.


Listing 17. 샘플 Hibernate 애플리케이션을 위한 persistence.xml

<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">

<provider>com.ibm.pdq.hibernate3.PDQHibernatePersistence</provider>
<!-- <provider>org.hibernate.ejb.HibernatePersistence</provider> -->

    <class>demo.CustomerInfo</class>     
    <class>demo.Customer</class> 
    <class>demo.District</class>
    <class>demo.Item</class>
    <class>demo.Order</class>
 		
<properties>
<property name="hibernate.connection.driver_class"
value="com.ibm.db2.jcc.DB2Driver"/>
					
<property name="hibernate.connection.url" 
value="jdbc:db2:demodb"/>
					
<property name="hibernate.connection.username" 
value="xx"/>
					
<property name="hibernate.connection.password" 
value="xx"/>  
        
<property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect"/>

<property name="hibernate.hbm2ddl.auto" 
value="update"/>

<property name="hibernate.jdbc.batch_size" 
value = "100"/>

<property name="hibernate.jdbc.factory_class" value = 
"com.ibm.pdq.hibernate3.batcher.PDQBatcherFactory"/>

<property name="hibernate.ejb.event.flush" value = 
"com.ibm.pdq.hibernate3.ejb3.listener.PDQEJB3FlushEventListener"/>

<property name="hibernate.connection.provider_class" value= 
"org.hibernate.connection.C3P0ConnectionProvider"/>

</properties>
</persistence-unit>

참고: Informix Dynamic Server를 사용하는 경우에는 persistence.xml의 hibernate.dialect 특성을 다음과 같이 InformixDialect로 설정해야 한다.
<property name = “hibernate.dialect” value = “org.hibernate.dialect.InformixDialect”/>

이제 MainClient.java를 실행하여 샘플 애플리케이션을 실행할 수 있다. 사용자 정의 pureQuery Batcher는 이기종 일괄처리 커서를 보장한다.

hibernate.cfg.xml을 사용하는 경우에는 SessionFactory API를 사용하는 MainClientSessionFactory.java 클래스를 실행함으로써 샘플 애플리케이션을 실행한다. 또한, c3p0.maxStatementsPerConnection 특성이 지정된 c3p0.properties 파일을 애플리케이션 경로에 삽입해야 한다.


샘플 애플리케이션의 경과 시간 성능 비교

이 섹션에서는 샘플 애플리케이션을 pureQuery 이기종 일괄처리 기능와 함께 실행했을 때, 애플리케이션의 성능이 개선되었는지 판별하는 방법을 설명한다.

경과 시간 수집

샘플 애플리케이션을 실행할 때, pureQuery 이기종 일괄처리 기능을 통해 경과 시간을 개선할 수 있는지 판별하려면 이기종 일괄처리 기능을 사용하는 경우와 그렇지 않은 경우를 분리하여 애플리케이션을 실행해야 한다.

경과 시간을 확인하는 한 가지 방법은 MainClient.javaMainClientSessionFactory.java를 사용하여 애플리케이션을 실행하는 것이다. 각 파일을 실행하면 이 파일이 프로그램을 실행하는 데 걸린 총 경과 시간이 표시된다.

또 다른 방법은 Batcher 추적 기능을 켜는 것이다. 이렇게 하면 일괄처리가 시작된 시점과 일괄처리에 명령문이 추가된 시점 및 일괄처리가 종료하는 시점을 알 수 있어서 IBM Integration Module이 이기종 일괄처리를 어떻게 작성하는지 실제로 확인할 수 있다. 샘플 애플리케이션에는 Batcher 추적 기능을 켜는 데 사용할 수 있는 log4j.properties 파일이 포함되어 있다. 일괄처리가 종료되면 현재 디렉토리에 Listing 18에 표시된 것과 비슷한 메시지가 포함된 demo.log 파일이 생성된다.


Listing 18. demo.log 파일의 추적 메시지

TRACE main com.ibm.pdq.hibernate3.batcher.PDQBatcher - PureQuery batch started

Added to the batch: insert into District (d_city, d_name, d_next_o_id, 
   d_state, d_street_1, d_street_2, d_tax, d_ytd, d_zip, version, d_id) 
   values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Added to the batch: insert into Customer (city, fname, lname, state, 
  street, version, zipcode, c_balance, c_credit, c_credit_lim, c_data, 
  c_delivery_cnt, c_discount, c_payment_cnt, c_since, c_ytd_payment, 
  district_d_id, c_d_id, c_id) 
   values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Added to the batch: insert into Item (i_data, i_name, i_price, version, i_id) 
   values (?, ?, ?, ?, ?)

Added to the batch: insert into Order (district_d_id, itime, o_all_local, o_c_id, 
    o_carrier_id, o_entry_d, o_ol_cnt, version, o_d_id, o_id) 
      values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Added to the batch: update District set d_city=?, d_name=?, d_next_o_id=?, d_state=?, 
    d_street_1=?, d_street_2=?, d_tax=?, d_ytd=?, d_zip=?, version=? 
       where d_id=? and version=?

Added to the batch: update Customer set city=?, fname=?, lname=?, state=?, street=?, 
  version=?, zipcode=?,    c_balance=?, c_credit=?, c_credit_lim=?, c_data=?, 
   c_delivery_cnt=?, c_discount=?, c_payment_cnt=?, c_since=?, c_ytd_payment=?, 
    district_d_id=? where c_d_id=? and c_id=? and version=?

Added to the batch: update Item set i_data=?, i_name=?, i_price=?, version=? 
   where i_id=? and version=?

TRACE main com.ibm.pdq.hibernate3.batcher.PDQBatcher - About to execute the batch
TRACE main com.ibm.pdq.hibernate3.batcher.PDQBatcher - Batch Executed.
  Executed batch size=7
TRACE main com.ibm.pdq.hibernate3.batcher.PDQBatcher - Number of batches 
   executed in the session = 1

샘플 결과

이 기사의 작성자는 일괄처리 크기를 100으로 설정한 상태에서 로컬 시스템과 원격 시스템에서 DB2를 대상으로 샘플 애플리케이션을 테스트했다. 이 테스트 작업을 통해 DB2 for Linux, UNIX, and Windows에서 다음과 같은 결과를 얻었다.

면책사항

이 문서에 포함된 모든 성능 데이터는 통제된 다양한 실험 환경에서 판별했으며 참조용으로만 활용할 수 있다. 고객은 이러한 성능 지수를 시스템 성능 표준으로 자신의 환경에 채택해서는 안 된다. 운영 환경에 따라 매우 다른 결과를 얻을 수 있다. 이 문서의 사용자는 자신의 특성 환경에 적용할 수 있는 데이터를 확인해야 한다.

  • DB2와 샘플 데이터 애플리케이션을 로컬 시스템에서 실행 중인 경우, pureQuery를 사용하면 JDBC를 사용했을 때에 비해 경과 시간의 성능이 트랜잭션당 오브젝트 수에 따라 40% 이상 개선되었다. 이러한 결과는 아래 그림 7에 표시되어 있다. 오브젝트당 7개의 SQL 문이 작성되었다. (결국, 오브젝트당 7개의 다양한 엔티티 오브젝트가 작성되었다.)
  • DB2가 원격 시스템에서 실행되고 있고 샘플 애플리케이션이 로컬 시스템에서 실행 중인 경우에는 트랜잭션당 오브젝트 수에 따라 경과 시간의 성능은 12 ~ 50% 범위에서 개선되었다. 이 결과는 아래 그림 8에 표시되어 있다. 오브젝트당 7개의 SQL 문이 작성되었다. (결국, 오브젝트당 7개의 다양한 엔티티 오브젝트가 작성되었다.)

그림 7에서 x 축은 트랜잭션당 오브젝트 수를 나타낸다. y 축은 트랜잭션에 소요된 경과 시간(밀리초)을 나타낸다. 이 차트를 보면 pureQuery를 사용할 때보다 JDBC 일괄처리 기능을 사용할 때가 경과 시간이 더 크다는 것을 알 수 있다.


그림 7. 로컬 데이터베이스를 대상으로 JDBC를 사용할 때와 pureQuery를 사용할 때의 경과 시간 비교
축의 첫 번째 지점에는 4개의 오브젝트가 있으며 JDBC를 사용할 때와 pureQuery를 사용할 때의 경과 시간은 각각 9.9와 3.32이다. 마지막 지점에서는 오브젝트 수가 84이며 각 경과 시간은 40.2ms와 26.1ms이다.

그림 8에서 x 축은 트랜잭션당 오브젝트 수를 나타낸다. y 축은 트랜잭션에 소요된 경과 시간(밀리초)을 나타낸다. 이 차트를 보면 pureQuery를 사용할 때보다 JDBC 일괄처리 기능을 사용할 때가 경과 시간이 더 크다는 것을 알 수 있다. 또한, 이 경우에는 트랜잭션당 오브젝트 수가 증가함에 따라 pureQuery와 JDBC 간의 경과 시간 차이(델타)가 증가한다.


그림 8 원격 데이터베이스를 대상으로 JDBC를 사용할 때와 pureQuery를 사용할 때의 경과 시간 비교
원격 데이터베이스의 경우, 오브젝트 수가 증가함에 따라 경과 시간은 더욱 급격하게 줄어든다. 오브젝트가 4개인 경우, JDBC를 사용할 때와 pureQuery를 사용할 때의 경과 시간은 각각 9.7ms와 8.6ms이다. 그러나 오브젝트 수가 84인 경우, 경과 시간은 각각 80.9ms와 35.2ms이다.

정적 SQL과 이기종 일괄처리 기능을 함께 사용하기

정적 SQL과 이기종 일괄처리 기능은 서로 독립적이다. 따라서 Hibernate 애플리케이션은 정적 SQL과 이기종 일괄처리 기능을 동시에 함께 사용하거나 각 기능을 독립적으로 사용할 수 있다. 각 기능을 설정하는 모든 단계에서 중복되는 부분은 없다. 정적 SQL을 설정하려면 Hibernate 애플리케이션에 pureQuery 정적 SQL 사용 섹션에 있는 단계를 따른다. 이기종 일괄처리 기능을 설정하려면 Hibernate 애플리케이션에 pureQuery 이기종 일괄처리 기능 사용 섹션에 있는 단계를 따른다. 두 기능을 모두 설정하려면 순서에 관계없이 두 섹션에 있는 각 단계를 따르기만 하면 된다.


증분식 캡처를 사용하여 기준 쿼리 수집하기

Hibernate 애플리케이션에서 기준 쿼리를 사용하는 경우, 증분식 캡처를 사용하여 기준 쿼리를 위한 SQL 문을 얻어서 정적 SQL로 변환할 수 있다. 이렇게 하기 위해서는 pdq.properties를 Listing 19와 같이 변경해야 한다. (앞으로 나올 HibernateGen.bat 버전에서는 기준 쿼리를 위한 SQL 문을 생성하는 기능이 지원될 계획이다.)


Listing 19. 증분식 캡처용 pdq.properties

pdq.captureMode=ON
pdq.executionMode=STATIC
pdq.pureQueryXml=test.pdqxml
pdq.OutputPureQueryXml=incremental_capture.pdqxml

애플리케이션을 실행하면 HibernateGen 명령을 실행할 때 작성되는 pdqxml 파일에는 없는 SQL 문을 포함하고 있는 incremental_capture.pdqxml 파일이 새로 작성된다. pureQuery 병합 유틸리티를 사용하여 두 파일을 병합할 수 있다. 이렇게 하면 두 파일에 있는 SQL이 포함된 하나의 통합 pdqxml 파일이 작성된다. Listing 20에는 pureQuery 병합 유틸리티를 실행하는 방법을 보여주는 예제가 표시되어 있다.


Listing 20. pureQuery 병합 유틸리티 실행

> java com.ibm.pdq.tools.Merge

  -outputPureQueryXml test_Merged.pdqxml

  -baseFile test.pdqxml

  -inputPureQueryXml incremental_capture.pdqxml

pureQuery 병합 유틸리티에 관한 자세한 정보는 참고자료 섹션을 참조한다.

Listing 20에 있는 샘플 병합 유틸리티를 실행한 후에는 test_Merged.pdqxml 파일을 바인드한다. 먼저 Listing 11에서 설명한 바와 같이 test_Merged.pdqxml 파일을 대상으로 StaticBinder를 실행한다. 그런 다음, 아래 Listing 21과 같이 pdq.properties 파일을 변경한다.


Listing 21. 증분식 캡처를 한 다음, 정적 SQL을 실행하기 위한 pdq.properties

pdq.captureMode=OFF
pdq.executionMode=STATIC
pdq.pureQueryXml=test_Merged.pdqxml

다시 애플리케이션을 실행한다. 그러면 기준 쿼리를 위해 생성된 SQL 또한, 정적으로 실행하게 된다.


결론

이 기사는 두 파트로 구성된 시리즈 기사 중 첫 번째 파트이다. 이 기사에서는 Hibernate 애플리케이션(Hibernate JPA 애플리케이션과 Hibernate 기본 애플리케이션)과 함께 IBM Integration Module for pureQuery and Hibernate를 사용하는 방법을 설명했다. 또한, pureQuery 클라이언트 최적화 증분식 캡처와 비공식 경과 시간 성능 측정치를 사용하는 방법에 대해 간단하게 살펴보았다. 이 시리즈의 Part 2에서는 iBATIS 애플리케이션을 집중적으로 살펴볼 예정이다.

IBM Integration Module for pureQuery and Hibernate를 이용하면 정적 SQL을 사용할 때, DB2의 성능을 대폭 개선할 수 있다. 또한, 이 모듈을 이용하여 이기종 일괄처리 기능을 적합한 애플리케이션과 함께 사용하면 DB2와 Informix 서버에서 경과 시간을 대폭 개선할 수 있다. 이러한 성능 개선은 J2EE와 J2SE 환경 모두에 적용된다.


감사의 인사

이 기사를 검토하여 중요한 피드백을 해준 Asim Singh과 Ambrish Bhargava에게 감사드린다.



다운로드 하십시오

설명이름크기다운로드 방식
Sample Hibernate application for this articleDemoHibApp.zip27KBHTTP

다운로드 방식에 대한 정보


참고자료

교육

제품 및 기술 얻기

토론

필자소개

Sandhya Turaga photo

Sandhya Turaga is a Software Engineer in the object query development team at IBM Silicon Valley Lab. Previously, while working as an intern at IBM, she worked on query performance improvement for ObjectGrid's object query language. She graduated with an MS in Computer Science from San Jose State University in May 2008, where her thesis work was on Grid computing.

Abhigyan Agrawal photo

Abhigyan Agrawal is a Software Engineer on the Open Source Team at IBM India Software Labs. Currently he is working on providing DB2 Static SQL support for Hibernate. Previously, he worked on providing DB2 Static SQL support in iBATIS and developing the IBM Python drivers. He graduated with an MTech in Information Technology from IIIT, Bangalore.

Author Photo: Kathy Zeidenstein

Kathy Zeidenstein has worked at IBM for a bazillion years. She has worked in Information Development, product management, and product marketing. Currently, she is the manager responsible for Information Development for Optim solutions for database development, administration, and design. Previously, she worked on the IBM Optim Solutions technical enablement team and was responsible for community development and communications.

Mario  Briggs photo

Mario Briggs leads the Open Source offerings for IBM DB2 and IBM Informix including PHP, Ruby/Rails, Python/Django/SqlAlchemy, Perl, and Java data access frameworks. Mario has about 11 years of experience in Software development with many of those years spent in the area of data access, relational engines, and application-database performance.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=Information Management, 오픈 소스, 자바
ArticleID=642835
ArticleTitle=pureQuery를 사용하여 Hibernate와 iBATIS 애플리케이션 성능 개선하기, Part1 : IBM Integration Module for pureQuery and Hibernate 사용하기
publish-date=08122010
author1-email=sturaga@us.ibm.com
author1-email-cc=
author2-email=abhigyan_agrawal@in.ibm.com
author2-email-cc=
author3-email=krzeide@us.ibm.com
author3-email-cc=
author4-email=mario.briggs@in.ibm.com
author4-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.