결과 집합 데이터 캐싱 샘플
이 SQL Server용 Microsoft JDBC Driver 샘플 애플리케이션에서는 데이터베이스에서 큰 데이터 세트를 검색하는 방법을 보여 줍니다. 그런 다음, SQLServerResultSet 개체의 setFetchSize 메서드를 사용하여 클라이언트에서 캐시되는 데이터의 행 수를 제어합니다.
참고 항목
클라이언트에 캐시된 행 수를 제한하는 것은 결과 집합에 포함될 수 있는 총 행 수를 제한하는 것과 다릅니다. 결과 집합에 포함된 전체 행 수를 제어하려면 SQLServerPreparedStatement 개체와 SQLServerCallableStatement 개체에서 상속된 SQLServerStatement 개체의 setMaxRows 메서드를 사용합니다.
클라이언트에서 캐시된 행 수의 한도를 설정하려면 Statement 개체를 만들 때 서버 쪽 커서를 사용하는 커서 형식을 지정합니다. 예를 들어, JDBC 드라이버에서 제공하는 TYPE_SS_SERVER_CURSOR_FORWARD_ONLY 커서 형식은 SQL Server 데이터베이스에서 사용되는 빠른 정방향 전용, 읽기 전용 서버 쪽 커서입니다.
참고 항목
이 대신에 SQL Server 전용 커서 유형을 사용하려면 selectMethod 연결 문자열 속성 값을 "cursor"로 설정하여 사용하면 됩니다. JDBC 드라이버에서 지원하는 커서 유형에 대한 자세한 내용은 커서 형식 이해를 참조하세요.
Statement 개체에서 쿼리를 실행하고 해당 데이터가 결과 집합으로 클라이언트에 반환된 후에는 setFetchSize
메서드를 호출하여 한 번에 데이터베이스에서 검색할 수 있는 데이터 양을 제어할 수 있습니다. 예를 들어, 하나의 테이블에 데이터 행 100개가 있으며 페치 크기가 10인 경우 클라이언트에서는 한 번에 10개의 데이터 행만 캐시됩니다. 이 설정으로 인해 데이터 처리 속도가 느려질 수 있지만 이 설정은 클라이언트에서 메모리를 더 적게 사용합니다. 이 시나리오는 너무 많은 메모리를 사용하지 않고 대량의 데이터를 처리해야 하는 경우에 유용합니다.
이 샘플의 코드 파일 이름은 CacheResultSet.java이며 다음과 같은 위치에서 찾아볼 수 있습니다.
\<installation directory>\sqljdbc_<version>\<language>\samples\resultsets
요구 사항
이 샘플 애플리케이션을 실행하려면 mssql-jdbc jar 파일을 포함하도록 클래스 경로를 설정합니다. 또한 AdventureWorks2022 샘플 데이터베이스에 대한 액세스 권한이 필요합니다. 클래스 경로를 설정하는 방법에 대한 자세한 내용은 JDBC 드라이버 사용을 참조하세요.
참고 항목
Microsoft JDBC Driver for SQL Server는 기본 설정된 JRE(Java Runtime Environment)에 따라 사용할 수 있는 mssql-jdbc 클래스 라이브러리 파일을 제공합니다. 선택할 JAR 파일에 대한 자세한 내용은 JDBC 드라이버에 대한 시스템 요구 사항을 참조하세요.
예시
다음 예제의 샘플 코드에서는 AdventureWorks2022 샘플 데이터베이스에 연결합니다. 그런 다음 SQLServerStatement 개체와 함께 SQL 문을 사용하고, 서버 쪽 커서 유형을 지정하고, SQL 문을 실행합니다. 데이터는 SQLServerResultSet 개체에서 반환됩니다.
다음으로, 샘플 코드에서는 사용할 페치 크기 및 결과 집합을 인수로 전달하여 사용자 지정 timerTest 메서드를 호출합니다. timerTest 메서드는 setFetchSize 메서드를 사용하여 결과 집합의 페치 크기를 설정하고, 테스트의 시작 시간을 설정한 다음, While
루프를 사용하여 결과 집합을 반복합니다. While
루프가 종료되는 즉시 코드는 테스트 중지 시간을 설정한 다음 페치 크기, 처리된 행 수 및 테스트를 실행하는 데 걸린 시간을 비롯한 테스트 결과를 표시합니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import com.microsoft.sqlserver.jdbc.SQLServerResultSet;
public class CacheResultSet {
@SuppressWarnings("serial")
public static void main(String[] args) {
// Create a variable for the connection string.
String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";
try (Connection con = DriverManager.getConnection(connectionUrl);
Statement stmt = con.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, SQLServerResultSet.CONCUR_READ_ONLY);) {
String SQL = "SELECT * FROM Sales.SalesOrderDetail;";
for (int n : new ArrayList<Integer>() {
{
add(1);
add(10);
add(100);
add(1000);
add(0);
}
}) {
// Perform a fetch for every nth row in the result set.
try (ResultSet rs = stmt.executeQuery(SQL)) {
timerTest(n, rs);
}
}
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}
private static void timerTest(int fetchSize,
ResultSet rs) throws SQLException {
// Declare the variables for tracking the row count and elapsed time.
int rowCount = 0;
long startTime = 0;
long stopTime = 0;
long runTime = 0;
// Set the fetch size then iterate through the result set to
// cache the data locally.
rs.setFetchSize(fetchSize);
startTime = System.currentTimeMillis();
while (rs.next()) {
rowCount++;
}
stopTime = System.currentTimeMillis();
runTime = stopTime - startTime;
// Display the results of the timer test.
System.out.println("FETCH SIZE: " + rs.getFetchSize());
System.out.println("ROWS PROCESSED: " + rowCount);
System.out.println("TIME TO EXECUTE: " + runTime);
System.out.println();
}
}