Пример считывания большого объема данных

Скачать драйвер JDBC

В этом примере приложения применяется Microsoft JDBC Driver для SQL Server для демонстрации процесса получения больших значений одного столбца из базы данных SQL Server с помощью метода getCharacterStream.

Файл кода для этого образца имеет имя ReadLargeData.java и находится в следующей папке:

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

Требования

Чтобы запустить этот пример приложения, вам потребуется доступ к образцу базы данных AdventureWorks2022. Необходимо также включить в параметр classpath путь к файлу mssql-jdbc.jar. См. сведения о том, как настроить параметр classpath, в руководстве по использованию JDBC Driver.

Примечание

Драйвер Microsoft JDBC Driver для SQL Server включает файлы библиотек классов mssql-jdbc, которые используются в зависимости от выбранных параметров среды выполнения Java (JRE). Для получения дополнительных сведений о том, какой JAR-файл выбрать, см. статью Требования к системе для драйвера JDBC.

Пример

В следующем примере пример кода устанавливает подключение к базе данных AdventureWorks2022. Затем образец кода создает образцы данных и обновляет таблицу Production.Document с помощью параметризированного запроса.

Кроме того, в образце кода показано, как получить режим адаптивной буферизации с помощью метода getResponseBuffering класса SQLServerStatement. Обратите внимание, что, начиная с версии драйвера JDBC 2.0, свойство соединения responseBuffering по умолчанию имеет значение «adaptive».

Затем в образце кода выполняется инструкция SQL с объектом SQLServerStatement, а возвращенные ею данные помещаются в объект SQLServerResultSet.

Наконец, выполняется проход по строкам данных, содержащимся в результирующем наборе, и выполняется доступ к некоторым из этих данных с помощью метода getCharacterStream.

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

import com.microsoft.sqlserver.jdbc.SQLServerStatement;

public class ReadLargeData {

    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>";
        
        // Create test data as an example.
        StringBuffer buffer = new StringBuffer(4000);
        for (int i = 0; i < 4000; i++)
            buffer.append((char) ('A'));
        
        try (Connection con = DriverManager.getConnection(connectionUrl);
                Statement stmt = con.createStatement();
                PreparedStatement pstmt = con.prepareStatement("UPDATE Production.Document SET DocumentSummary = ? WHERE (DocumentID = 1)");) {

            pstmt.setString(1, buffer.toString());
            pstmt.executeUpdate();

            // In adaptive mode, the application does not have to use a server cursor
            // to avoid OutOfMemoryError when the SELECT statement produces very large
            // results.

            // Create and execute an SQL statement that returns some data.
            String SQL = "SELECT Title, DocumentSummary FROM Production.Document";

            // Display the response buffering mode.
            SQLServerStatement SQLstmt = (SQLServerStatement) stmt;
            System.out.println("Response buffering mode is: " + SQLstmt.getResponseBuffering());
            SQLstmt.close();

            // Get the updated data from the database and display it.
            ResultSet rs = stmt.executeQuery(SQL);

            while (rs.next()) {
                Reader reader = rs.getCharacterStream(2);
                if (reader != null) {
                    char output[] = new char[40];
                    while (reader.read(output) != -1) {
                        // Do something with the chunk of the data that was
                        // read.
                    }

                    System.out.println(rs.getString(1) + " has been accessed for the summary column.");
                    // Close the stream.
                    reader.close();
                }
            }
        }
        // Handle any errors that may have occurred.
        catch (SQLException | IOException e) {
            e.printStackTrace();
        }
    }
}

См. также раздел

Работа с большими объемами данных