大きなデータを更新するサンプル

JDBC ドライバーのダウンロード

この Microsoft JDBC Driver for SQL Server サンプル アプリケーションは、 データベースの大きな値の列を更新する方法を示しています。

このサンプルのコード ファイルは UpdateLargeData.java という名前で、次の場所にあります。

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

要件

このサンプル アプリケーションを実行するには、AdventureWorks2022 サンプル データベースにアクセスする必要があります。 また、クラスパスの設定で sqljdbc4.jar ファイルを追加する必要があります。 クラスパスに sqljdbc4.jar のエントリがない場合、サンプル アプリケーションで "Class not found" という一般的な例外がスローされます。 クラスパスを設定する方法の詳細については、「JDBC ドライバーの使用」を参照してください。

Note

Microsoft JDBC Driver for SQL Server には、sqljdbc.jar、sqljdbc4.jar、sqljdbc41.jar、または sqljdbc42.jar というクラス ライブラリ ファイルが用意されており、お好みの Java Runtime Environment (JRE) 設定に応じて使用できます。 このサンプルは、JDBC 4.0 API で導入された isWrapperFor メソッドと unwrap メソッドを使用して、ドライバー固有の応答バッファリング メソッドにアクセスします。 このサンプルをコンパイルして実行するには、JDBC 4.0 をサポートする sqljdbc4.jar クラス ライブラリが必要となります。 選択する JAR ファイルの詳細については、「JDBC Driver のシステム要件」を参照してください。

次の例のサンプル コードでは、AdventureWorks2022 データベースへの接続を行います。 さらに、Statement オブジェクトを作成し、isWrapperFor メソッドを使用して、Statement オブジェクトが、指定された SQLServerStatement クラスのラッパーであるかどうかをチェックします。 ドライバー固有の応答バッファリング メソッドにアクセスするために、unwrap メソッドが使用されています。

次に、SQLServerStatement クラスの setResponseBuffering メソッドを使用して、応答バッファリング モードを "adaptive" に設定します。サンプル コードを見ると、アダプティブ バッファリング モードの取得方法も確認できます。

さらに、SQL ステートメントを実行し、返されたデータを更新可能な SQLServerResultSet オブジェクトに設定しています。

最後に、結果セット内のデータ行を繰り返し処理します。 空のドキュメント概要が見つかった場合、updateString メソッドと updateRow メソッドを組み合わせて使用して、データの行を更新し、再度データベースに格納します。 既にデータが存在する場合は、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);
    }
}

関連項目

大きなデータの処理