Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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();
}
}