Exemplo de dados do conjunto de resultados de caching
Este aplicativo de exemplo do Microsoft JDBC Driver para SQL Server demonstra como recuperar um conjunto de dados grande de um banco de dados. Depois, ele controla o número de linhas de dados armazenadas em cache no cliente, usando o método setFetchSize do objeto SQLServerResultSet.
Observação
Limitar o número de linhas armazenadas em cache no cliente é diferente de limitar o número total de linhas que um conjunto de resultados pode conter. Para controlar o número total de linhas contidas em um conjunto de resultados, use o método setMaxRows do objeto SQLServerStatement, herdado pelos objetos SQLServerPreparedStatement e SQLServerCallableStatement.
Para definir um limite no número de linhas armazenadas em cache no cliente, especifique um tipo de cursor que usa um cursor do lado do servidor ao criar objetos Statement. Por exemplo, o JDBC Driver fornece o tipo de cursor TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, que é um cursor somente de avanço rápido, somente leitura, do lado do servidor, para uso com bancos de dados do SQL Server.
Observação
Uma alternativa ao uso de tipo de cursor específico do SQL Server é usar a propriedade de cadeia de conexão selectMethod, definindo seu valor como "cursor". Para obter mais informações sobre os tipos de cursor que têm suporte no JDBC driver, confira Noções básicas sobre os tipos de cursor.
Depois de executar a consulta no objeto Statement e os dados forem retornados ao cliente como um conjunto de resultados, chame setFetchSize
para controlar a quantidade de dados recuperados do banco de dados de uma só vez. Por exemplo, se você tiver uma tabela com 100 linhas de dados e o tamanho do fetch for 10, apenas dez linhas de dados serão armazenadas em cache no cliente a qualquer momento. Embora essa configuração possa diminuir a velocidade com que os dados são processados, ela usa menos memória no cliente. Esse cenário é útil quando você precisa processar grandes quantidades de dados sem usar muita memória.
O arquivo de código desta amostra chama-se CacheResultSet.java e pode ser encontrado no seguinte local:
\<installation directory>\sqljdbc_<version>\<language>\samples\resultsets
Requisitos
Para executar este aplicativo de exemplo, defina o classpath para incluir o arquivo mssql-jdbc.jar. Também será necessário ter acesso ao banco de dados de exemplo AdventureWorks2022. Para obter mais informações sobre como definir o caminho de classe, confira Como usar o JDBC Driver.
Observação
O Microsoft JDBC Driver para SQL Server fornece os arquivos de biblioteca de classes mssql-jdbc a serem usados de acordo com suas configurações preferenciais do JRE (Java Runtime Environment). Para saber mais sobre qual arquivo JAR escolher, confira os requisitos do sistema para o JDBC Driver.
Exemplo
No exemplo a seguir, o código de exemplo faz uma conexão com o banco de dados de exemplo AdventureWorks2022. Em seguida, ele usa uma instrução SQL com o objeto SQLServerStatement , especifica o tipo de cursor do lado do servidor e executa a instrução SQL. Os dados são retornados em um objeto SQLServerResultSet.
A seguir, o código de exemplo chama o método timerTest personalizado, passando como argumentos o tamanho do fetch a ser usado e o conjunto de resultados. Em seguida, o método timerTest define o tamanho do fetch do conjunto de resultados usando o método setFetchSize, define a hora de início do teste e, depois, itera pelo conjunto de resultados com um loop While
. Assim que o loop While
é finalizado, o código define o tempo de parada do teste e, em seguida, exibe o resultado do teste, incluindo o tamanho do fetch, o número de linhas processadas e o tempo necessário para executar o teste.
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();
}
}