Esempio di aggiornamento di dati di grandi dimensioni
L'applicazione di esempio del driver JDBC per Microsoft SQL Server illustra in che modo aggiornare una colonna di grandi dimensioni in un database.
Il file di codice per questo esempio è updateLargeData.java ed è disponibile nel seguente percorso:
<directory di installazione>\sqljdbc_<versione>\<lingua>\help\samples\adaptive
Requisiti
Per eseguire questa applicazione di esempio, sarà necessario accedere al database di esempio AdventureWorks di SQL Server 2005, 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 ulteriori informazioni sull'impostazione del classpath, vedere Utilizzo del driver JDBC.
Nota
Con il driver JDBC versione 2.0 per Microsoft SQL Server vengono forniti i file di libreria di classi sqljdbc.jar e sqljdbc4.jar, da utilizzare a seconda delle impostazioni preferite di Java Runtime Environment (JRE). In questo esempio vengono utilizzati 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 ulteriori informazioni sul file JAR da scegliere, vedere Requisiti di sistema per il driver JDBC.
Esempio
Nell'esempio seguente mediante il codice di esempio viene eseguita una connessione al database AdventureWorks di SQL Server 2005. Viene quindi creato un oggetto Statement e viene utilizzato 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 utilizzato il metodo unwrap.
Viene quindi impostata la modalità di memorizzazione delle risposte nel buffer come "adaptive" utilizzando 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 incluse nel set di risultati. Se viene trovato un riepilogo di documento vuoto, verrà utilizzata 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à utilizzato il metodo getString per visualizzare parte dei dati in essa contenuti.
Si noti che a partire dalla versione 2.0 del driver JDBC, il comportamento predefinito del driver è "adaptive.". 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 buffer adattivo in modo esplicito utilizzando il metodo setResponseBuffering della classe SQLServerStatement.
import java.sql.*;
import java.io.*;
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://localhost:1433;" +
"databaseName=AdventureWorks;integratedSecurity=true;";
// Declare the JDBC objects.
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
Reader reader = null;
try {
// Establish the connection.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(connectionUrl);
stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
// Since the summaries could be large, 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 SQL Server JDBC Driver
// 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.
rs = stmt.executeQuery("SELECT Title, DocumentSummary FROM Production.Document");
// Update each document summary.
while (rs.next()) {
// Retrieve the original document summary.
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();
}
else
{
// Do something with the chunk of the data that was
// read.
System.out.println("reading " + rs.getString("Title"));
reader.close();
reader = null;
}
}
}
// Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
}
finally {
if (reader != null) try { reader.close(); } catch(Exception e) {}
if (rs != null) try { rs.close(); } catch(Exception e) {}
if (stmt != null) try { stmt.close(); } catch(Exception e) {}
if (con != null) try { con.close(); } catch(Exception e) {}
}
}
}