Пример кэширования данных результирующего набора
В этом примере приложения драйвера Microsoft JDBC Driver for SQL Server демонстрируется извлечение большого набора данных из базы данных. Затем оно управляет количеством строк данных, кэшируемых на клиенте, с помощью метода setFetchSize объекта SQLServerResultSet.
Примечание.
Ограничение количества строк, кэшируемых на клиенте, отличается от ограничения общего количества строк, которое может содержаться в результирующем наборе. Для управления общим количеством строк, которое может содержаться в результирующем наборе, следует использовать метод setMaxRows объекта SQLServerStatement, наследуемый объектами SQLServerPreparedStatement и SQLServerCallableStatement.
Чтобы установить ограничение на количество строк, кэшируемых на клиенте, укажите тип курсора, который использует курсор на стороне сервера при создании объектов Statement. Например, драйвер JDBC обеспечивает тип курсора TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, который является быстрым однопроходным курсором только для чтения на стороне сервера для использования при работе с базой данных SQL Server.
Примечание.
Альтернативой использованию определенного типа курсора SQL Server является использование свойства строки соединения selectMethod при задании для него значения "cursor". См. сведения о типах курсоров, поддерживаемых драйвером JDBC.
После выполнения запроса в объекте Statement и возврате данных клиенту в виде результирующего набора вызовите метод setFetchSize
для управления объемом данных, извлекаемых единовременно из базы данных. Например, если имеется таблица, в которой содержится 100 строк данных, и значение размера выборки равно 10, то на клиенте в определенный момент времени будет кэшироваться только 10 строк. Хотя этот параметр может замедлить скорость обработки данных, он использует меньше памяти на клиенте. Этот сценарий полезен, когда нужно обработать большие объемы данных, не используя слишком много памяти.
Файл кода для этого примера с именем CacheResultSet.java находится в следующей папке:
\<installation directory>\sqljdbc_<version>\<language>\samples\resultsets
Требования
Чтобы запустить этот пример приложения, включите в параметр classpath путь к файлу mssql-jdbc.jar. Вам также нужен доступ к образцу базы данных AdventureWorks2022. См. сведения о том, как настроить classpath в руководстве по использованию драйвера JDBC Driver.
Примечание.
Драйвер Microsoft JDBC для SQL Server предоставляет файлы библиотеки классов mssql-jdbc для использования в зависимости от предпочитаемых параметров среды выполнения Java (JRE). Для получения дополнительных сведений о том, какой JAR-файл выбрать, см. статью Требования к системе для драйвера JDBC.
Пример
В следующем примере пример кода делает подключение к образцу базы данных AdventureWorks2022. Затем используется инструкция SQL с объектом SQLServerStatement, указывается тип курсора на стороне сервера и выполняется инструкция SQL. Данные возвращаются в объекте SQLServerResultSet.
Затем образец кода вызывает специальный метод timerTest, передавая в качестве аргументов размер выборки для использования и результирующий набор. Затем метод timerTest задает размер выборки результирующего набора с помощью метода setFetchSize, задает время начала проверки и затем просматривает результирующий набор в цикле While
. После завершения цикла While
код задает время завершения проверки и отображает результат проверки, включая размер выборки, количество обработанных строк и время выполнения проверки.
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();
}
}