Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Esta aplicação de exemplo do Microsoft JDBC Driver para SQL Server demonstra como recuperar um grande conjunto de dados de uma base de dados. Depois, controla o número de linhas de dados que são armazenadas em cache no cliente usando o método setFetchSize do objeto SQLServerResultSet .
Observação
Limitar o número de linhas 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 num conjunto de resultados, use o método setMaxRows do objeto SQLServerStatement , que é herdado tanto pelos objetos SQLServerPreparedStatement como SQLServerCallableStatement .
Para definir um limite para o número de linhas em cache no cliente, especifique um tipo de cursor que utilize um cursor do lado do servidor ao criar objetos de Declaração. Por exemplo, o driver JDBC fornece o tipo de cursor TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, que é um cursor do lado do servidor apenas para avanço rápido e apenas leitura para uso com bases de dados SQL Server.
Observação
Uma alternativa ao uso do tipo de cursor específico do SQL Server é usar a propriedade de cadeia de ligação selectMethod, definindo o seu valor como "cursor". Para mais informações sobre os tipos de cursor suportados pelo driver JDBC, consulte Compreender os tipos de cursores.
Depois de executar a consulta no objeto Statement e os dados serem devolvidos ao cliente como um conjunto de resultados, chame setFetchSize para controlar quantos dados são recuperados da base de dados de cada vez. Por exemplo, se tiver uma tabela com 100 linhas de dados e o tamanho do fetch for 10, apenas 10 linhas de dados estão armazenadas em cache no cliente de cada vez. Embora esta configuração possa abrandar a velocidade a que os dados são processados, consome menos memória no cliente. Este cenário é útil quando é necessário processar grandes quantidades de dados sem usar demasiada memória.
O ficheiro de código desta amostra chama-se CacheResultSet.java e pode ser encontrado na seguinte localização:
\<installation directory>\sqljdbc_<version>\<language>\samples\resultsets
Requerimentos
Para executar esta aplicação de exemplo, defina o caminho de classe para incluir o ficheiro jar mssql-jdbc. Também precisa de acesso à base de dados de exemplo do AdventureWorks2025. Para mais informações sobre como definir o percurso de classes, veja Usar o Driver JDBC.
Observação
O Microsoft JDBC Driver para SQL Server fornece ficheiros de biblioteca de classes mssql-jdbc para serem usados dependendo das definições do seu Java Runtime Environment (JRE) preferidas. Para mais informações sobre qual ficheiro JAR escolher, consulte Requisitos de Sistema para o Driver JDBC.
Example
No exemplo seguinte, o código de exemplo faz uma ligação à base de dados de exemplo AdventureWorks2025. Depois, utiliza 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 devolvidos num objeto SQLServerResultSet.
De seguida, o código de exemplo chama o método personalizado timerTest, passando como argumentos o tamanho da busca a usar e o conjunto de resultados. O método timerTest define então o tamanho de 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 ciclo (loop) While. Assim que o While ciclo é encerrado, o código define o tempo de paragem do teste e depois exibe o resultado do teste, incluindo o tamanho do fetch, o número de linhas processadas e o tempo que demorou a 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();
}
}