동적 조회 서비스 사용

개발 프로세스에서 일반 EJB(Enterprise JavaBeans) 조회 서비스(배치 조회라고도 함) 대신 동적 조회 서비스를 사용하려는 경우가 생길 수 있습니다. 예를 들어, 테스트 중에 동적 조회 서비스는 애플리케이션 런타임에 사용할 수 있기 때문에 애플리케이션을 다시 배치하지 않아도 됩니다.

이 태스크 정보

다음은 일반적인 EJB 조회 서비스 대신에 동적 조회 서비스를 사용하는 이유입니다.
  • 배치 시가 아니라 애플리케이션 런타임 시 조회를 프로그래밍적으로 정의해야 합니다.
  • 조회에서 다중 CMP 또는 CMR 필드를 리턴해야 합니다. (배치 조회는 단일 요소만 SELECT 절에 지정하도록 허용합니다.) 자세한 정보는 예제: EJB 조회 주제를 참조하십시오.
  • 조회에서 계산된 표현식을 리턴하고자 합니다.
  • 조회문에서 값 오브젝트 메소드 또는 Bean 메소드를 사용하고자 합니다. 자세한 정보는 경로 표현식 주제를 참조하십시오.
  • 개발 중 EJB 조회를 대화식으로 테스트하려 하지만, 파인더를 업데이트하거나 조회를 선택할 때마다 애플리케이션을 반복적으로 배치하고 싶지는 않습니다.

Stateless 세션 Bean인 동적 조회 API의 사용은 다른 J2EE EJB 애플리케이션 Bean의 사용과 비슷합니다. 이는 API 패키지의 com.ibm.websphere.ejbquery에 포함되어 있습니다.

동적 조회 Bean은 원격 및 로컬 인터페이스 모두가 있습니다. 조회에서 원격 EJB 참조를 리턴하고 싶거나 조회문이 원격 메소드를 포함하는 경우, 조회 원격 인터페이스를 사용해야 합니다.

remote interface = com.ibm.websphere.ejbquery.Query
remote home interface = com.ibm.websphere.ejbquery.QueryHome

조회에서 로컬 EJB 참조를 리턴하고 싶거나 조회문이 로컬 메소드를 포함하는 경우, 조회 로컬 인터페이스를 사용해야 합니다.

local interface = com.ibm.websphere.ejbquery.QueryLocal
local home interface = com.ibm.websphere.ejbquery.QueryLocalHome

애플리케이션 서버 메모리를 덜 사용하기 때문에 로컬 인터페이스는 원격보다 전체적으로 나은 EJB 성능을 보장합니다.

프로시저

  1. 애플리케이션이 실행될 애플리케이션 서버에 query.ear 애플리케이션 파일이 설치되어 있는지 확인하십시오. 해당 서버가 제품 설치 시 작성되는 기본 애플리케이션 서버와 다른 경우도 확인해야 합니다.
    query.ear 파일은 app_server_root 디렉토리에 있습니다. 여기서 <WAS_HOME>은 WebSphere Application Server가 있는 위치입니다. 제품 설치 프로그램은 query.ear 파일을
    com/ibm/websphere/ejbquery/Query
    (사용자 또는 시스템 관리자가 이름을 변경할 수 있음)의 JNDI 이름을 사용하여 기본 애플리케이션 서버에 설치합니다.
  2. 중요한 데이터에 대한 액세스를 제어하려면 원격 및 로컬 동적 조회 인터페이스에서 executeQuery(), prepareQuery(), executePlan() 메소드에 대한 권한을 설정하십시오. (애플리케이션에 보안이 필요한 경우에만 이 단계가 필요합니다.)

    동적 EJB 조회에 어떤 ASN 이름, CMP 필드 또는 CMR 필드가 사용되는지를 제어할 수 없기 때문에, 사용자 또는 시스템 관리자는 메소드 사용에 제한을 두어야 합니다. 예를 들어, 사용자에게 executeQuery 메소드 실행이 허용되었으면 해당 사용자는 유효한 동적 조회를 실행할 수 있습니다. 프로덕션 환경에서는 원격 조회 인터페이스 메소드에 대해 액세스를 제한하려고 합니다.

  3. 애플리케이션 클라이언트 코드의 일부분으로 동적 조회를 기록하십시오. 조회 모델로 예제 주제인 원격 인터페이스 동적 조회 예제 및 로컬 인터페이스 동적 조회 예제를 참조할 수 있습니다. 조회 모델은 사용할 가져오기 구문이 어떤 것인지를 설명합니다.
  4. 조회하려는 CMP가 다른 모듈에 있으면 다음을 수행해야 합니다.
    1. query.ear에서 원격 검색 수행
    2. query.ear 파일을, 조회한 CMP Bean이 설치된 서버에 맵핑하십시오.
  5. 클래스 경로의 qryclient.jar 파일을 사용하여 클라이언트 프로그램을 컴파일하고 실행하십시오.

동적 조회에 대한 원격 인터페이스 사용

원격 인터페이스를 사용하여 동적 EJB(Enterprise JavaBeans) 조회를 실행할 때 조회 인터페이스에서 executeQuery 메소드를 호출합니다. executeQuery 메소드는 이 인터페이스에 대한 REQUIRED 트랜잭션 속성을 가지고 있습니다. 그러므로 실행할 조회에 대한 정확한 변환 컨텍스트를 구현할 필요는 없습니다.

원격 인터페이스를 사용하여 동적 EJB(Enterprise JavaBeans) 조회를 실행할 때 조회 인터페이스에서 executeQuery 메소드를 호출합니다. executeQuery 메소드는 이 인터페이스에 대한 REQUIRED 트랜잭션 속성을 가지고 있습니다. 그러므로 실행할 조회에 대한 정확한 변환 컨텍스트를 구현할 필요는 없습니다.

다음 가져오기 문을 시작하십시오.

import com.ibm.websphere.ejbquery.QueryHome;
import com.ibm.websphere.ejbquery.Query;
import com.ibm.websphere.ejbquery.QueryIterator;
import com.ibm.websphere.ejbquery.IQueryTuple;
import com.ibm.websphere.ejbquery.QueryException;

그런 다음, 다음 예제가 급료가 낮은 직원 이름과 EJB 참조를 가져올 때 문자열 양식에 조회문을 기록하십시오.

String query = 
"select e.name as name , object(e) as emp from EmpBean e where e.salary < 50000"; 

QueryHome 클래스에서 참조를 가져와 Query 오브젝트를 작성하십시오. (이 클래스는 executeQuery 메소드를 정의합니다.) 단순화하기 위해 다음 예제는 Query 오브젝트에 대한 동적 조회 JNDI 이름을 사용합니다.

InitialContext ic = new InitialContext();

Object obj =  ic.lookup("com/ibm/websphere/ejbquery/Query");

QueryHome  qh = 
 ( QueryHome) javax.rmi.PortableRemoteObject.narrow( obj, QueryHome.class );
Query qb = qh.create();

그런 다음, QueryIterator 오브젝트(QueryIterator 클래스에 있음)에 정의되는 조회 결과 세트의 최대 크기를 지정해야 합니다. 이 클래스는 QueryIterator API 패키지 내에 포함됩니다. 다음으로 QueryIterator 오브젝트(QueryIterator API 패키지에 있음)에 정의되는 조회 결과 세트의 최대 크기를 지정해야 합니다. 이 예제는 결과 세트의 최대 크기를 99로 지정합니다.

QueryIterator it = qb.executeQuery(query, null, null ,0, 99 );
반복기에는 IQueryTuple 오브젝트 콜렉션이 있습니다. 리턴 콜렉션 값의 레코드입니다. 예제 조회문의 기준에 따라 이 시나리오의 각 튜플은 name의 값 하나와 object(e)의 값 하나를 포함합니다. 조회 결과를 표시하려면 다음의 코드를 사용하십시오.
while (it.hasNext()) {
	IQueryTuple tuple = (IQueryTuple) it.next();
	System.out.print( it.getFieldName(1) );
	String s = (String) tuple.getObject(1);
	System.out.println( s);
	System.out.println( it.getFieldName(2) );
	Emp e = ( Emp) javax.rmi.PortableRemoteObject.narrow( tuple.getObject(2), Emp.class );
	System.out.println( e.getPrimaryKey().toString());
}
프로그램에서의 출력은 다음과 유사합니다.
name Bob 
emp 1001
name Dave
emp 298003
...
마지막으로, 모든 예외를 포착하고 처리합니다. 조회문의 구문 오류 또는 런타임 처리 오류로 인해 예외가 발생할 수 있습니다. 다음 예제는 이러한 예외를 캐시하고 처리합니다.
} catch (QueryException qe) {
    System.out.println("Query Exception "+ qe.getMessage() );
}

원격 인터페이스 조회에 대한 큰 결과 콜렉션 처리

조회를 큰 콜렉션에 리턴하려면, 결과를 더 관리 가능한 수량으로 나누어 작은 여러 부분으로 리턴하는 프로그래밍 옵션을 사용할 수 있습니다. 답변을 청크로 가져오려면 원격 executeQuery 메소드에서 skipRow 및 maxRow 매개변수를 사용하십시오. 예를 들어 다음과 같습니다.

int skipRow=0;
int maxRow=100;
QueryIterator it = null;
do {
	it = qb.executeQuery(query, null, null ,skipRow, maxRow );
	while (it.hasNext()) {
	// display result 
	skipRow = skipRow + maxRow;
}
} while ( ! it.isComplete() ) ;
동적 조회에 대한 로컬 인터페이스 사용

로컬 인터페이스를 사용하여 동적 EJB(Enterprise JavaBeans) 조회를 실행할 때 QueryLocal 인터페이스에서 executeQuery 메소드를 호출합니다. 이 인터페이스는 메소드에 대한 트랜잭션을 초기화하지 않습니다. 그러므로 실행할 조회에 대한 트랜잭션 컨텍스트를 명시적으로 설정해야 합니다.

참고: 트랜잭션 컨텍스트를 설정하기 위해 다음 예제는 begin() 및 commit() 메소드를 호출합니다. 이러한 메소드 사용에 대한 대안으로, 트랜잭션 컨텍스트 내에서 실행되는 EJB 메소드 내에서 간단하게 조회 코드를 임베드하면 됩니다.

다음 가져오기 구문으로 조회 코드를 시작하십시오.

import com.ibm.websphere.ejbquery.QueryLocalHome;
import com.ibm.websphere.ejbquery.QueryLocal;
import com.ibm.websphere.ejbquery.QueryLocalIterator;
import com.ibm.websphere.ejbquery.IQueryTuple;
import com.ibm.websphere.ejbquery.QueryException;

그런 다음, 다음 예제가 급료가 낮은 직원 이름과 EJB 참조를 가져올 때 문자열 양식에 조회문을 기록하십시오.

String query = 
"select e.name, object(e) from EmpBean e where e.salary < 50000 ";

QueryLocalHome 클래스에서 참조를 가져와 QueryLocal 오브젝트를 작성하십시오. (이 클래스는 executeQuery 메소드를 정의합니다.) 다음 예제에서는 ejb/query가 동적 조회 JNDI 이름(com/ibm/websphere/ejbquery/Query)을 가리키는 로컬 EJB 참조로 사용됩니다.

InitialContext ic = new InitialContext();
   QueryLocalHome  qh =  ( LocalQueryHome) ic.lookup( "java:comp/env/ejb/query" );
QueryLocal qb = qh.create();

코드의 마지막 부분은 트랜잭션을 초기화하고, executeQuery 메소드를 호출하고, 조회 결과를 표시합니다. QueryLocalIterator 클래스는 조회 결과 세트를 정의하기 때문에 인스턴스화됩니다. 이 클래스는 클래스 QueryIterator API 패키지에 포함되어 있습니다. 반복기는 트랜잭션 마지막에서 유효성을 상실합니다. 그러므로 동일한 트랜잭션 범위에서 반복기를 executeQuery 호출로 사용해야 합니다.

userTransaction.begin();
QueryLocalIterator it = qb.executeQuery(query, null, null);
while (it.hasNext()) {
	IQueryTuple tuple = (IQueryTuple) it.next();
	System.out.print( it.getFieldName(1) );
	String s = (String) tuple.getObject(1);
	System.out.println( s);
	System.out.println( it.getFieldName(2) );
	EmpLocal e = ( EmpLocal ) tuple.getObject(2);
	System.out.println( e.getPrimaryKey().toString());
}
userTransaction.commit();

대부분의 경우 QueryLocalIterator 오브젝트는 수요 주도형 입니다. 즉, 데이터가 점진적으로 리턴되기 때문에 데이터베이스에서 각 레코드를 가져올 때 next() 메소드가 반복기에서 호출되어야 합니다. (반복기가 수요 주도형이 아닌 경우도 있습니다. 자세한 정보는 동적 조회 성능 고려사항 주제의 로컬 조회 인터페이스 하위 절을 참조하십시오.)

전체 조회 결과 세트는 애플리케이션 서버 메모리에서 점진적으로 구체화되기 때문에 크기를 쉽게 조절할 수 있습니다. 예를 들어, 테스트 실행 시 조회 결과의 일부 튜플만 리턴할 필요가 있다는 것을 결정해야 합니다. 이 경우 조회 루프를 닫기 위해 QueryLocalIterator 오브젝트에서 close() 메소드 호출을 사용할 수 있습니다. 이렇게 하면 반복기가 사용하는 SQL 자원을 활용할 수 있습니다. 그렇지 않으면 메모리 또는 트랜잭션 끝에서 전체 결과 세트를 계산하기 전까지 자원을 사용할 수 없습니다.


주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tque_dynamic
파일 이름:tque_dynamic.html