Sdílet prostřednictvím


Ukázka dat uložených do mezipaměti pro sadu výsledků

Stáhnout ovladač JDBC

Tento ukázkový ovladač Microsoft JDBC pro SQL Server ukazuje, jak načíst velkou sadu dat z databáze. Pak řídí počet řádků dat, které jsou uloženy v mezipaměti klienta pomocí setFetchSize metoda SQLServerResultSet objektu.

Poznámka:

Omezení počtu řádků uložených v mezipaměti klienta se liší od omezení celkového počtu řádků, které sada výsledků může obsahovat. Chcete-li řídit celkový počet řádků, které jsou obsaženy v sadě výsledků, použijte setMaxRows metoda SQLServerStatement objektu, který je zděděn sqlServerPreparedStatement a SQLServerCallableStatement objekty.

Chcete-li nastavit limit počtu řádků uložených v mezipaměti klienta, zadejte typ kurzoru, který používá kurzor na straně serveru při vytváření objektů příkazů. Například ovladač JDBC poskytuje typ kurzoru TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, což je rychlý kurzor jen pro čtení na straně serveru pro použití s databázemi SQL Serveru.

Poznámka:

Alternativou k použití typu kurzoru specifického pro SQL Server je použití vlastnosti připojovacího řetězce selectMethod a nastavení jeho hodnoty na "kurzor". Další informace o typech kurzorů podporovaných ovladačem JDBC naleznete v tématu Principy typů kurzorů.

Po spuštění dotazu v objektu Statement a poté, co se data vrátí klientovi jako sada výsledků, zavolejte setFetchSize pro řízení, kolik dat se z databáze načte najednou. Pokud máte například tabulku s 100 řádky dat a velikost načtení je 10, v klientovi se najednou ukládá do mezipaměti jenom 10 řádků dat. I když toto nastavení může zpomalit rychlost zpracování dat, využívá méně paměti v klientovi. Tento scénář je užitečný, když potřebujete zpracovat velké objemy dat bez použití příliš velké paměti.

Soubor kódu pro tuto ukázku má název CacheResultSet.java a najdete ho v následujícím umístění:

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

Požadavky

Pokud chcete spustit tuto ukázkovou aplikaci, nastavte cestu třídy tak, aby zahrnovala soubor jar mssql-jdbc. Potřebujete také přístup k ukázkové databázi AdventureWorks2025. Další informace o tom, jak nastavit classpath, naleznete v tématu Použití ovladače JDBC.

Poznámka:

Ovladač Microsoft JDBC pro SQL Server poskytuje soubory knihovny tříd mssql-jdbc, které se mají použít v závislosti na preferovaném nastavení prostředí Java Runtime Environment (JRE). Další informace o tom, který soubor JAR zvolit, naleznete v tématu Požadavky na systém pro ovladač JDBC.

Example

V následujícím příkladu vzorový kód vytvoří připojení k ukázkové databázi AdventureWorks2025. Potom používá příkaz SQL s objektem SQLServerStatement , určuje typ kurzoru na straně serveru a spustí příkaz SQL. Data jsou vrácena v SQLServerResultSet objektu.

Dále vzorový kód volá vlastní metodu timerTest, která předává jako argumenty velikost načtení, která se má použít, a sadu výsledků. Metoda TimerTest pak nastaví velikost načtení sady výsledků pomocí metody setFetchSize, nastaví počáteční čas testu a pak iteruje prostřednictvím sady výsledků pomocí smyčky While. Jakmile se While smyčka ukončí, kód nastaví dobu zastavení testu a pak zobrazí výsledek testu, včetně velikosti načtení, počtu zpracovaných řádků a času, který trvalo provedení testu.

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();
    }
}

Viz také

Práce se sadami výsledků