대규모 데이터 업데이트 샘플

JDBC 드라이버 다운로드

이 SQL Server용 Microsoft JDBC 드라이버 샘플 애플리케이션에서는 데이터베이스의 큰 열을 업데이트하는 방법을 보여 줍니다.

이 샘플의 코드 파일 이름은 UpdateLargeData.java이며 다음과 같은 위치에 있습니다.

\<installation directory>\sqljdbc_<version>\<language>\samples\adaptive

요구 사항

이 샘플 애플리케이션을 실행하려면 AdventureWorks2022 샘플 데이터베이스에 대한 액세스 권한이 필요합니다. 또한 sqljdbc4.jar 파일을 포함하도록 클래스 경로를 설정해야 합니다. 클래스 경로에 sqljdbc4.jar에 대한 항목이 누락되어 있다면 샘플 응용 프로그램에서 "클래스를 찾을 수 없음" 일반 예외가 발생합니다. 클래스 경로를 설정하는 방법에 대한 자세한 내용은 JDBC 드라이버 사용을 참조하세요.

참고 항목

SQL Server용 Microsoft JDBC Driver는 기본 설정된 JRE(Java Runtime Environment) 설정에 따라 사용할 수 있는 sqljdbc.jar, sqljdbc4.jar, sqljdbc41.jar 또는 sqljdbc42.jar 클래스 라이브러리 파일을 제공합니다. 이 샘플에서는 JDBC 4.0 API에 도입된 isWrapperForunwrap 메서드를 사용하여 드라이버별 응답 버퍼링 메서드에 액세스합니다. 이 샘플을 컴파일하고 실행하려면 JDBC 4.0을 지원하는 sqljdbc4.jar 클래스 라이브러리가 있어야 합니다. 선택할 JAR 파일에 대한 자세한 내용은 JDBC 드라이버에 대한 시스템 요구 사항을 참조하세요.

예시

다음 예제의 샘플 코드에서는 AdventureWorks2022 데이터베이스에 연결합니다. 그런 다음 샘플 코드는 Statement 개체를 만들고 isWrapperFor 메서드를 사용하여 Statement 개체가 지정된 SQLServerStatement 클래스의 래퍼인지 여부를 검사합니다. unwrap 메서드는 드라이버 관련 응답 버퍼링 메서드에 액세스하는 데 사용됩니다.

다음으로, 샘플 코드는 SQLServerStatement 클래스의 setResponseBuffering 메서드를 사용하여 응답 버퍼링 모드를 "적응"으로 설정하고 적응 버퍼링 모드를 가져오는 방법도 보여 줍니다.

그런 다음 SQL 문을 실행하여 문에서 반환되는 데이터를 업데이트 가능한 SQLServerResultSet 개체로 지정합니다.

마지막으로 샘플 코드는 결과 집합에 있는 데이터 행을 반복합니다. 빈 문서 요약이 발견되면 updateStringupdateRow 메서드 조합을 사용하여 데이터 행을 업데이트하고 데이터베이스에 다시 보관합니다. 이미 데이터가 있다면 getString 메서드를 사용하여 일부 데이터를 표시합니다.

드라이버의 기본 동작은 “adaptive”입니다. 그러나 정방향 전용 업데이트 가능 결과 집합의 경우 및 결과 집합의 데이터가 응용 프로그램 메모리보다 큰 경우에는 애플리케이션에서 SQLServerStatement 클래스의 setResponseBuffering 메서드를 사용하여 명시적으로 선택 버퍼링 모드를 설정해야 합니다.

import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.microsoft.sqlserver.jdbc.SQLServerStatement;


public class UpdateLargeData {

    public static void main(String[] args) {

        // Create a variable for the connection string.
        String connectionUrl = "jdbc:sqlserver://<server>:<port>;databaseName=AdventureWorks;user=<user>;password=<password>";

        // Establish the connection.
        try (Connection con = DriverManager.getConnection(connectionUrl); Statement stmt = con.createStatement();
                Statement stmt1 = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);) {

            createTable(stmt);

            // Since the summaries could be large, we should make sure that
            // the driver reads them incrementally from a database,
            // even though a server cursor is used for the updatable result sets.

            // The recommended way to access the Microsoft JDBC Driver for SQL Server
            // specific methods is to use the JDBC 4.0 Wrapper functionality.
            // The following code statement demonstrates how to use the
            // Statement.isWrapperFor and Statement.unwrap methods
            // to access the driver specific response buffering methods.

            if (stmt.isWrapperFor(com.microsoft.sqlserver.jdbc.SQLServerStatement.class)) {
                SQLServerStatement SQLstmt = stmt.unwrap(com.microsoft.sqlserver.jdbc.SQLServerStatement.class);

                SQLstmt.setResponseBuffering("adaptive");
                System.out.println("Response buffering mode has been set to " + SQLstmt.getResponseBuffering());
            }

            // Select all of the document summaries.
            try (ResultSet rs = stmt1.executeQuery("SELECT Title, DocumentSummary FROM Document_JDBC_Sample")) {

                // Update each document summary.
                while (rs.next()) {

                    // Retrieve the original document summary.
                    try (Reader reader = rs.getCharacterStream("DocumentSummary")) {

                        if (reader == null) {
                            // Update the document summary.
                            System.out.println("Updating " + rs.getString("Title"));
                            rs.updateString("DocumentSummary", "Work in progress");
                            rs.updateRow();
                        }
                    }
                }
            }
        }
        // Handle any errors that may have occurred.
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void createTable(Statement stmt) throws SQLException {
        stmt.execute("if exists (select * from sys.objects where name = 'Document_JDBC_Sample')"
                + "drop table Document_JDBC_Sample");

        String sql = "CREATE TABLE Document_JDBC_Sample (" + "[DocumentID] [int] NOT NULL identity,"
                + "[Title] [char](50) NOT NULL," + "[DocumentSummary] [varchar](max) NULL)";

        stmt.execute(sql);

        sql = "INSERT Document_JDBC_Sample VALUES ('title1','summary1') ";
        stmt.execute(sql);

        sql = "INSERT Document_JDBC_Sample (title) VALUES ('title2') ";
        stmt.execute(sql);

        sql = "INSERT Document_JDBC_Sample (title) VALUES ('title3') ";
        stmt.execute(sql);

        sql = "INSERT Document_JDBC_Sample VALUES ('title4','summary3') ";
        stmt.execute(sql);
    }
}

참고 항목

‬큰 데이터 작업