다음을 통해 공유


선택 버퍼링 사용

선택 버퍼링은 Microsoft SQL Server 2005 JDBC 드라이버 버전 1.2의 새로운 기능으로 서버 커서 오버헤드 없이 모든 종류의 큰 값 데이터를 검색할 수 있도록 디자인되었습니다.

일반적으로 Microsoft SQL Server 2005 JDBC 드라이버는 쿼리를 실행할 때 모든 결과를 서버에서 검색하여 응용 프로그램 메모리에 넣습니다. 이 방법은 SQL Server에서 리소스 소비를 최소화하지만 매우 큰 결과를 생성하는 쿼리의 경우 JDBC 응용 프로그램에서 OutOfMemoryError가 발생할 수 있습니다.

응용 프로그램에서 매우 큰 결과를 처리할 수 있도록 하기 위해 Microsoft SQL Server 2005 JDBC 드라이버 버전 1.2에서는 선택 버퍼링을 제공합니다. 응용 프로그램 개발자가 문에 선택 버퍼링을 사용하려고 하는 이유는 다음과 같습니다.

  • 쿼리로 매우 큰 결과 집합이 생성되는 경우: 응용 프로그램이 메모리에 저장할 수 있는 행보다 더 많은 행을 생성하는 SELECT 문을 응용 프로그램에서 실행할 수 있습니다. 이전 릴리스에서는 OutOfMemoryError를 방지하기 위해 응용 프로그램에서 서버 커서를 사용해야 했습니다. 그러나 버전 1.2 릴리스에서는 선택 버퍼링을 대신 사용할 수 있습니다. 선택 버퍼링을 통해 서버 커서 없이도 임의로 큰 결과 집합의 정방향 읽기 전용 전달을 수행할 수 있습니다.

  • 쿼리로 매우 큰 SQLServerResultSet 열 또는 SQLServerCallableStatement OUT 매개 변수 값이 생성되는 경우: 너무 커서 응용 프로그램 메모리에 저장할 수 없는 단일 값(열 또는 OUT 매개 변수)을 응용 프로그램에서 검색할 수 있습니다. 선택 버퍼링은 getAsciiStream, getBinaryStream 또는 getCharacterStream 메서드를 사용하여 클라이언트 응용 프로그램에서 이러한 값을 스트림으로 검색할 수 있도록 합니다. 응용 프로그램은 스트림에서 읽기를 수행할 때 SQL Server에서 값을 검색합니다.

선택 버퍼링 설정

다음은 응용 프로그램에서 문 실행 시 선택 버퍼링을 사용하도록 요청할 수 있는 세 가지 방법입니다.

get<Type>Stream 메서드를 사용하여 큰 값을 한 번 읽은 다음 SQL Server에서 반환하는 순서로 ResultSet 열과 CallableStatement OUT 매개 변수에 액세스하면 결과를 처리할 때 선택 버퍼링이 응용 프로그램 메모리 사용량을 최소화합니다. 선택 버퍼링을 사용하면 다음과 같은 결과를 얻을 수 있습니다.

  • SQLServerResultSetSQLServerCallableStatement 클래스에 정의된 get<Type>Stream 메서드는 응용 프로그램에서 표시하는 경우 스트림을 재설정할 수 있다 하더라도 기본적으로 한 번 읽기 스트림을 반환합니다. 응용 프로그램에서 스트림 reset을 원할 경우 먼저 해당 스트림에서 mark 메서드를 호출해야 합니다.

  • SQLServerClobSQLServerBlob 클래스에 정의된 get<Type>Stream 메서드는 mark 메서드를 호출하지 않고 항상 스트림의 시작 위치로 변경될 수 있는 스트림을 반환합니다.

응용 프로그램에서 선택 버퍼링을 사용하는 경우 get<Type>Stream 메서드에 의해 검색된 값은 한 번만 검색될 수 있습니다. 같은 개체의 get<Type>Stream 메서드를 호출한 후 같은 열이나 매개 변수에서 get<Type> 메서드를 호출하려고 하면 "데이터에 액세스되었으나 이 열이나 매개 변수에는 사용할 수 없습니다."라는 메시지와 함께 예외가 발생합니다.

응용 프로그램 메모리 사용량 최소화

응용 프로그램의 메모리 사용량을 최소화하기 위해 개발자들이 따라야 할 중요한 지침은 다음과 같습니다.

  • 응용 프로그램에서 매우 큰 결과 집합을 처리하는 것을 허용하는 연결 문자열 속성 selectMethod=cursor를 사용하지 않도록 합니다. Microsoft SQL Server 2005 JDBC 드라이버 버전 1.2의 선택 버퍼링 기능은 응용 프로그램이 서버 커서를 사용하지 않고 매우 큰 정방향 읽기 전용 결과 집합을 처리할 수 있도록 합니다.

  • getBlob 또는 getClob 메서드 대신 getAsciiStream, getBinaryStream 또는 getCharacterStream 메서드를 사용하여 대용량 텍스트 또는 이진 값을 스트림으로 읽습니다. 버전 1.2 릴리스에서는 SQLServerCallableStatement 클래스가 이를 위해 새로운 get<Type>Stream 메서드를 제공합니다.

  • SELECT 문에서 잠재적으로 큰 값을 갖는 열이 열 목록의 마지막에 배치되도록 하고 SQLServerResultSetget<Type>Stream 메서드를 사용하여 해당 메서드가 선택된 순서로 해당 열에 액세스하도록 합니다.

  • SQLServerCallableStatement 생성에 사용된 SQL에서 잠재적으로 큰 값을 갖는 OUT 매개 변수가 매개 변수 목록의 마지막에 선언되도록 합니다. 또한 SQLServerCallableStatementget<Type>Stream 메서드를 사용하여 해당 메서드가 선언된 순서로 OUT 매개 변수에 액세스하도록 합니다.

  • 둘 이상의 문이 같은 연결에서 동시에 실행되지 않도록 합니다. 이전 문의 결과를 처리하기 전에 다른 문을 실행하면 처리되지 않은 결과가 응용 프로그램 메모리에 버퍼링될 수 있습니다.

참고 항목

관련 자료

JDBC 드라이버로 성능 및 안정성 개선