JSP 조치를 통해 사용 가능한 모든 기능은
DBSelect, DBProcedureCall 또는 DBModify Bean을
작성하기 위한 jsp:useBean 조치를 사용한 후 Bean에서 메소드를 실행하기 위한
scriptlet을 사용하여 JSP 페이지에서도 사용할 수 있습니다. JSP SQL 조치는 DB Bean의 완전한 유연성이 필요하지 않을 때 편리를 위해 제공됩니다. JSP SQL 조치를 사용할 경우와 직접 Bean을 사용할 경우를 비교했을 때
제한사항은 다음과 같습니다.
- 데이터베이스와의 연결이 필요한 JSP SQL 조치의 경우,
연결은 태그가 발견될 때 열리고 태그가 처리된 후 닫힙니다. 두 조치는 동일 트랜잭션 범위 내에서 수행할 수 있습니다.
동일 JDBC 연결을 사용할 경우에도 마찬가지입니다. 유일한 예외는
x:batch 조치를 통하는 것입니다. x:batch 본문 내에 있는 조치는
동일 연결을 공유하며 선택적으로 동일 트랜잭션도 공유합니다.
DB Bean을 직접 사용할 경우,
데이터베이스 연결을 열고 닫는 시기를 완전히 제어할 수 있습니다. 또한 AutoCommit를 작동 또는 해제하고 명시적 확약 또는 롤백을 수행할 수 있는
능력과 함께 트랜잭션 범위에 대한 완전한 제어도 가지고 있습니다.
JSP SQL
조치를 사용할 때 연결에 대한 제어를 제한하는 이유는 트랜잭션과 연결이
부주의로 열려 있어서 데이터베이스 자원을 가동하는 일이 없도록 하기 위해서입니다.
- 대형 결과 세트에 대한 DBSelect 및 DBProcedureCall Bean의 메소드 및 특성 중 일부는
JSP SQL 조치를 통해 제공되지 않습니다.
이러한 메소드 및 특성을 사용하여 한 번에 메모리에 유지보수하는 행 수를
제한하고 추가 행을 페치할 때 한 번에 페치할 행 수를 지정할 수 있습니다. 이러한 한계는 위에서 설명한 것처럼 각 JSP SQL 조치가 처리된 후 데이터베이스 연결이
닫히는 제한 때문입니다. 초기에 행의 서브세트만 메모리에 페치된 후
연결이 닫힌 경우, 나중에 나머지 행을 페치할 방법이 없습니다. JSP SQL 조치는 x:select 및 x:procedureCall 조치의
maxRows 속성을 통해 대형 결과 세트에 대한 지원을 제공합니다.
이 속성은 단지 하나의 결과 세트에서 패치할 행 수를 제한합니다.
- DBSelect 및 DBProcedureCall Bean의 lockRows 특성은
JSP SQL 조치를 통해 제공되지 않습니다. 이 특성을 사용하면 결과 세트의 행이
현재 행인 동안 임의의 행에 대해 데이터베이스 잠금이 유지됩니다. 웹 응용프로그램의 경우,
임의 시간 동안 퍼져 있을 수 있는 사용자 상호작용 사이에 이러한
잠금을 유지보수하는 것을 원하지 않을 것입니다. 위에서 설명한 첫 번째 한계(각 JSP SQL 조치가 처리된 후
데이터베이스 연결이 닫힘)로 인해, JSP SQL 태그를 사용할 때 이러한 잠금을 유지보수할 수
없습니다. JSP SQL 태그에서, 또는 DB Bean을 직접 사용할 때
행 잠금을 사용하지 않을 경우, 사용자가 행을 읽는 시간과 갱신하려고 하는 시간 사이에
누군가 이 행을 갱신할 경우 행이 갱신되지 않도록 하기 위해 "optimistic" 잠금이
사용됩니다.
- 행 사이와 결과 세트 사이의 이동을 위한 다양한 방법은
JSP SQL 조치를 통하기 보다는 DB Bean의 직접적인 사용을 통해
가능합니다. 이를 제공하지 않는 기본적인 이유는 단지
예상되는 사용 빈도입니다. JSP SQL 조치는 간단하게 유지하고
거의 사용하지 않을 방법으로 인터페이스를 혼잡하게 만들지 않으려고 합니다.
표준 JSP 조치 <jsp:getProperty>
및 <jsp:setProperty>를 사용하여 DBSelect, DBModify
및 DBProcedureCall Bean의 특성을 가져오고 설정할 수 있지만,
일부는 유용하지 않습니다. (예를 들어,
DBSelect Bean의 lockRows 특성을 설정할 수 있지만 위에 설명된 이유로
어떤 것도 이루지 못합니다.)
또한 JSP SQL 태그 라이브러리의 조치를 사용하는 것과
DB Bean을 직접 사용하는 것을 혼합할 수도 있습니다. x:select 조치를 사용하여
DBSelect Bean을 작성할 경우 해당되는 메소드는 scriptlet에서 실행할 수 있습니다.