Esempio di aggiornamento di dati di grandi dimensioni
L'applicazione di esempio Microsoft JDBC Driver per SQL Server illustra come aggiornare una colonna di grandi dimensioni in un database.
Il file di codice per questo esempio è UpdateLargeData.java ed è disponibile nel seguente percorso:
\<installation directory>\sqljdbc_<version>\<language>\samples\adaptive
Requisiti
Per eseguire questa applicazione di esempio, è necessario accedere al database di esempio AdventureWorks2022. nonché impostare il classpath per includere il file sqljdbc4.jar. Se nel classpath manca una voce per il file sqljdbc4.jar, nell'applicazione di esempio verrà generata un'eccezione comune di classe non trovata. Per altre informazioni su come impostare il classpath, vedere Uso del driver JDBC.
Nota
Microsoft JDBC Driver per SQL Server fornisce i file di libreria di classi sqljdbc.jar, sqljdbc4.jar, sqljdbc41.jar o sqljdbc42.jar da usare a seconda delle impostazioni preferite di Java Runtime Environment (JRE). In questo esempio vengono usati i metodi isWrapperFor e unwrap, introdotti nell'API di JDBC 4.0, per accedere ai metodi di memorizzazione delle risposte nel buffer specifici del driver. Per compilare ed eseguire questo esempio, sarà necessaria la libreria di classi sqljdbc4.jar, che fornisce il supporto per JDBC 4.0. Per altre informazioni su quale file JAR scegliere, vedere Requisiti di sistema per il driver JDBC.
Esempio
Nell'esempio seguente, mediante il codice di esempio viene eseguita una connessione al database AdventureWorks2022. Viene quindi creato un oggetto Statement e viene usato il metodo isWrapperFor per verificare se l'oggetto Statement è un wrapper per la classe SQLServerStatement specificata. Per accedere ai metodi di memorizzazione delle riposte nel buffer specifici del driver, viene usato il metodo unwrap.
Viene quindi impostata la modalità di memorizzazione delle risposte nel buffer come "adaptive" usando il metodo setResponseBuffering della classe SQLServerStatement e viene inoltre illustrato come ottenere la modalità del buffer adattivo.
Viene quindi eseguita l'istruzione SQL e i dati restituiti vengono collocati in un oggetto SQLServerResultSet aggiornabile.
Viene infine eseguita un'iterazione nelle righe di dati nel set di risultati. Se viene trovato un riepilogo di documento vuoto, verrà usata la combinazione di metodi updateString e updateRow per aggiornare la riga di dati e renderla di nuovo permanente nel database. Se sono già presenti dati, verrà usato il metodo getString per visualizzare parte dei dati.
Il comportamento predefinito del driver è "adattivo". Tuttavia, per i set di risultati aggiornabili forward-only e quando le dimensioni del set di risultati sono maggiori della memoria dell'applicazione, l'applicazione deve impostare la modalità di memorizzazione nel buffer adattiva in modo esplicito usando il metodo setResponseBuffering della classe SQLServerStatement.
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerStatement;
public class UpdateLargeData {
public static void main(String[] args) {
// Create a variable for the connection string.
String connectionUrl = "jdbc:sqlserver://<server>:<port>;databaseName=AdventureWorks;user=<user>;password=<password>";
// Establish the connection.
try (Connection con = DriverManager.getConnection(connectionUrl); Statement stmt = con.createStatement();
Statement stmt1 = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);) {
createTable(stmt);
// Since the summaries could be large, we should make sure that
// the driver reads them incrementally from a database,
// even though a server cursor is used for the updatable result sets.
// The recommended way to access the Microsoft JDBC Driver for SQL Server
// specific methods is to use the JDBC 4.0 Wrapper functionality.
// The following code statement demonstrates how to use the
// Statement.isWrapperFor and Statement.unwrap methods
// to access the driver specific response buffering methods.
if (stmt.isWrapperFor(com.microsoft.sqlserver.jdbc.SQLServerStatement.class)) {
SQLServerStatement SQLstmt = stmt.unwrap(com.microsoft.sqlserver.jdbc.SQLServerStatement.class);
SQLstmt.setResponseBuffering("adaptive");
System.out.println("Response buffering mode has been set to " + SQLstmt.getResponseBuffering());
}
// Select all of the document summaries.
try (ResultSet rs = stmt1.executeQuery("SELECT Title, DocumentSummary FROM Document_JDBC_Sample")) {
// Update each document summary.
while (rs.next()) {
// Retrieve the original document summary.
try (Reader reader = rs.getCharacterStream("DocumentSummary")) {
if (reader == null) {
// Update the document summary.
System.out.println("Updating " + rs.getString("Title"));
rs.updateString("DocumentSummary", "Work in progress");
rs.updateRow();
}
}
}
}
}
// Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
}
}
private static void createTable(Statement stmt) throws SQLException {
stmt.execute("if exists (select * from sys.objects where name = 'Document_JDBC_Sample')"
+ "drop table Document_JDBC_Sample");
String sql = "CREATE TABLE Document_JDBC_Sample (" + "[DocumentID] [int] NOT NULL identity,"
+ "[Title] [char](50) NOT NULL," + "[DocumentSummary] [varchar](max) NULL)";
stmt.execute(sql);
sql = "INSERT Document_JDBC_Sample VALUES ('title1','summary1') ";
stmt.execute(sql);
sql = "INSERT Document_JDBC_Sample (title) VALUES ('title2') ";
stmt.execute(sql);
sql = "INSERT Document_JDBC_Sample (title) VALUES ('title3') ";
stmt.execute(sql);
sql = "INSERT Document_JDBC_Sample VALUES ('title4','summary3') ";
stmt.execute(sql);
}
}