EJB 조회의 데이터베이스 제한
EJB(Enterprise JavaBeans) 조회 기능은 특정 데이터베이스 제한사항을 준수해야 합니다.
일반 데이터베이스 제한사항
- 특정 조회와 관련되는 모든 엔터프라이즈 Bean은 동일한 데이터 소스로 맵핑해야 합니다. EJB 조회는 교차 데이터 소스 결합 조작을 지원하지 않습니다.
- ejbSelect EJB 조회 언어 조회에 대해 WebSphere® Application Server 배치
코드 생성 유틸리티가 생성한 SQL(Structured Query Language)문은 모든 열에 널값으로
구성된 결과 세트로 행을 리턴할 수 있습니다.
런타임에서 지속성 관리자는 수신한 세트를 이 조회의 결과로 저장합니다. 애플리케이션이 결과 Bean의 기본 키를 검색하면 지속성 관리자가 추출기를 호출합니다. 추출기는 EJB 배치 생성 클래스 메소드입니다. 이 메소드는 모든 널 열 항목에 0 값을 리턴합니다. 이 값은 다시 EJB 컨테이너로 전달되어 애플리케이션에 전달됩니다. EJB 컨테이너는 PK 값이 0인 Bean 인스턴스를 호출합니다. 이 경우 이 Bean 인스턴스가 널 PK 또는 PK 값 0을 갖는지 여부를 일반 사용자가 판별할 수 없으므로 문제가 발생할 수 있습니다.
이 문제를 방지하려면 파인더 조회에서 IS NOT NULL 절을 사용하여 결과 세트에서 그러한 널값을 제거하십시오.
특정 데이터베이스 제한사항
데이터베이스 제품이 다르면 EJB 조회 명령문에 포함할 수 있는 요소에 대한 제한사항도 다릅니다. 다음은 이러한 제한사항의 목록입니다. 데이터베이스 관리자에게 문의하여 사용자 환경에 적용되는 사항이 있는지 확인하십시오.
- 특정 함수는 다른 데이터베이스에서 지원되지 않기 때문에 DB2®에 대해 실행되는 조회에서만 사용됩니다. 이런 함수에는 날짜 및 시간 산술 연산식, 공급업체별로 이식 가능에 나열되지 않는 함수를 포함하는 특정 스칼라 함수, 특정 CMP(Container Managed Persistence) 필드 맵핑에 사용되는 내재 스칼라 함수가 포함됩니다. 예를 들어, int 숫자 유형의 10진 (5,2) 유형 필드로의 맵핑을 고려하십시오. DB2 이외의 데이터베이스에 대해 배치되는 경우, 이 특정 맵핑과 함께 CMP 필드를 포함하는 finder 또는 select 조회는 실패하여 조회를 실행할 수 없음 오류 메시지가 표시됩니다.
- 데이터베이스의 CLOB(Character Large Object)에 맵핑되는 경우, 데이터베이스가 CLOB 비교를 지원하지 않으므로 비교 조작에서 문자열 유형 CMP 필드를 사용할 수 없습니다.
- 데이터베이스는 비교 연산자를 사용하여 리터럴 또는 입력 매개변수로 사용되는 문자열 값의 길이를 제한할 수 있습니다. 이러한 제한은 조회 성능을 저하시킬 수 있습니다. 예: z/OS® 플랫폼의 DB2의 경우 검색 "name = ?1"은 런타임에서 ?1 값의 길이가 255보다 큰 경우 실패할 수 있습니다.
- 다른 유형을 포함하는 열로 숫자 CMP 유형을 맵핑하면 예상치 못한 결과가 발생할 수 있습니다. 예를 들어, int 숫자 유형을 10진 (5,2) 유형 열로 맵핑하는 경우를 고려해 보십시오. 이 시나리오에서는 데이터베이스에서 엔터프라이즈 Bean CMP 필드로의 전송과 다시 데이터베이스로의 전송 과정에서 정확한 10진 값(예: 12.25 값)을 보존하지 않습니다. 이러한 맵핑을 수행하면 초기값이 정수(이 경우 12)로 대체됩니다. 결과적으로 CMP 필드가 이러한 속성의 맵핑을 사용하는 경우 비교 연산에서 CMP 필드를 사용하지 않게 됩니다.
- 일부 데이터베이스는 java.sql.Time 시맨틱에 해당하는 데이터 유형을 지원하지 않습니다. 예를 들어, java.sql.Time 유형의 CMP 필드가 Oracle DATE 열로 맵핑되고 시간에 대한 비교를 수행하는 경우, 열 값의 년-월-일 부분이 맵핑에서 잘려 예상한 결과가 나타나지 않을 수 있습니다.
- 일부 데이터베이스는 길이가 0인 문자열 값( '' )을 널값으로 처리하며 이는 결과 조회에 영향을 줄 수 있습니다. 이식성을 위해서 길이가 0인 문자열 값의 사용을 피하십시오.
- 일부 데이터베이스는 정수 산술 규칙을 사용하여 두 정수 값 사이의 나눗셈을 수행하고 다른 데이터베이스는 비정수 규칙을 사용합니다. 두 가지 유형의 데이터베이스를 사용하는 환경에서는 이러한 불일치가 바람직하지 않습니다. 이식성을 위해서 EJB 조회에서 정수 값 나누기는 피하십시오.
UDB DB2 for i5/OS™ i의 Current® 릴리스는 "yyyy-mm-dd-hh.mm.ss.nnnnnn" 형식의 TIMESTAMP 값만 지원합니다. 이는 java.sql.Timestamp 클래스에서 지원되는 표준 형식("yyyy-mm-dd-hh mm.ss.nnnnnn")과 호환되지 않습니다. TIMESTAMP 스칼라 함수는 java.sql.Timestamp 오브젝트의 문자열 표시를 DB2 UDB for IBM i에서 인식되는 값으로 변환할 때 사용되어야 합니다.