Aller au contenu principal

Exécuter des query en utilisant le Driver JDBC

Cette page contient des exemples qui vous montrent comment exécuter des queries à l'aide du Driver JDBC Databricks, version 3 et supérieure.

remarque

Le Driver JDBC Databricks comporte une limite de 256 parameters pour les requêtes paramétrées.

Exemple : Exécuter une query

L’exemple suivant montre comment utiliser le Driver JDBC Databricks pour exécuter une query Databricks SQL à l’aide d’une ressource compute Databricks.

Java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Properties;

public class DatabricksJDBCExample {

public static void main(String[] args) {

Class.forName("com.databricks.client.jdbc.Driver");

// Set JDBC URL properties
String jdbcUrl = "jdbc:databricks://dbc-a1b2345c-d6e7.cloud.databricks.com:443";
Properties connectionProperties = new Properties();
connectionProperties.put("httpPath", "sql/protocolv1/o/123456780012345/0123-123450-z000pi22");
connectionProperties.put("ssl", "1");

// Set authentication properties (personal access token)
connectionProperties.put("AuthMech", "3");
connectionProperties.put("user", "token");
connectionProperties.put("password", "12345678901234667890abcdabcd");

// Set logging properties
connectionProperties.put("logPath", "logs/myapplication.log");

// Establish connection and execute query
try (Connection connection = DriverManager.getConnection(jdbcUrl, connectionProperties);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM samples.nyctaxi.trips")) {

// Get metadata and column names
ResultSetMetaData metaData = resultSet.getMetaData();
String[] columns = new String[metaData.getColumnCount()];
for (int i = 0; i < columns.length; i++) {
columns[i] = metaData.getColumnName(i + 1);
}

// Process and print the result set
while (resultSet.next()) {
System.out.print("Row " + resultSet.getRow() + "=[");
for (int i = 0; i < columns.length; i++) {
if (i != 0) {
System.out.print(", ");
}
System.out.print(columns[i] + "='" + resultSet.getObject(i + 1) + "'");
}
System.out.println("]");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

Exemple : Exécuter une query de manière asynchrone

Les exemples suivants montrent comment utiliser le Driver JDBC Databricks pour exécuter et gérer une query Databricks SQL asynchrone.

Pour la référence de l'API, consultez la référence de l'API Java pour le Driver JDBC Databricks.

Lancer l'exécution asynchrone d'une instruction :

Java
Statement statement = conn.createStatement();
IDatabricksStatement dbStatement = statement.unwrap(IDatabricksStatement.class);

ResultSet result = dbStatement.executeAsync(sql);
IDatabricksResultSet asyncResult = result.unwrap(IDatabricksResultSet.class);
IExecutionStatus asyncStatus = asyncResult.getExecutionStatus();
long startTime = System.currentTimeMillis();
while ((asyncStatus.getExecutionState() == ExecutionState.RUNNING | asyncStatus.getExecutionState() == ExecutionState.PENDING) || (startTime + timeout < System.currentTimeMillis())) {
Thread.sleep(1000); // Sleep for 1000 ms
asyncResult = dbStatement.getExecutionResult().unwrap(IDatabricksResultSet.class);
asyncStatus = asyncResult.getExecutionStatus();
}

if (asyncStatus.getExecutionStatus() == ExecutionState.RUNNING | ExecutionState.PENDING) {
dbStatement.cancel();
}

if (asyncStatus.getExecutionStatus() == ExecutionState.SUCCEEDED) {
// process result set
}

if (asyncStatus.getExecutionStatus() == ExecutionState.FAILED) {
String sqlState = asyncStatus.getSqlState();
String errorMessage = asyncStatus.getErrorMessage();
// log error code and message
}

Gérer une instruction dans un thread séparé :

Java
Statement statement = conn1.createStatement();
IDatabricksStatement dbStatement = statement.unwrap(IDatabricksStatement.class);

ResultSet asyncResult = dbStatement.executeAsync(sql);
IDatabricksResultSet drs = asyncResult.unwrap(IDatabricksResultSet.class);
String statementId = drs.getStatementId();

ExecutionState state = drs.getExecutionStatus().getExecutionState();

while (state != ExecutionState.SUCCEEDED) {
Thread.sleep(sleepInterval);
asyncResult = dbStatement.getExecutionResult();
state = asyncResult.unwrap(IDatabricksResultSet.class).getExecutionStatus().getExecutionState();
}


// In another thread
IDatabricksConnection dbConn2 = conn2.unwrap(IDatabricksConnection.class);
IDatabricksStatement asyncStatementHandle = dbConn2.getStatement(statementId).unwrap(IDatabricksStatement.class);
IDatabricksResultSet asyncResultHandle = asyncStatementHandle.getExecutionResult().unwrap(IDatabricksResultSet.class);

// Cancel if needed
if (asyncResultHandle.getExecutionStatus().getExecutionState() == ExecutionState.PENDING | asyncResultHandle.getExecutionStatus().getExecutionState() == ExecutionState.RUNNING) {
asyncStatementHandle.cancel();
}

Fermer une connexion à l'aide d'un ID de connexion :

Java

// Get connection-Id from existing connection
String connectionId = conn.unwrap(IDatabricksConnection.class).getConnectionId();

// Close the connection from other thread using same JDBC Url and connection properties and connection-Id retrieved from above
com.databricks.client.jdbc.Driver.getInstance().closeConnection(jdbcUrl, properties, connectionId);

Exemple : Query des données géospatiales

L'exemple suivant montre comment query et récupérer des types de données géospatiales à l'aide du Databricks JDBC Driver. Pour récupérer des données géospatiales en tant qu'objets Java structurés, activez les propriétés de connexion EnableComplexDatatypeSupport et EnableGeoSpatialSupport.

Pour plus d'informations sur les types de données et les fonctions géospatiales, voir Fonctions géospatiales ST.

Java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Properties;
import com.databricks.jdbc.api.IGeometry;
import com.databricks.jdbc.api.IGeography;

public class GeospatialExample {

public static void main(String[] args) {

// Set JDBC URL properties
String jdbcUrl = "jdbc:databricks://dbc-a1b2345c-d6e7.cloud.databricks.com:443";
Properties connectionProperties = new Properties();
connectionProperties.put("httpPath", "sql/protocolv1/o/123456780012345/0123-123450-z000pi22");
connectionProperties.put("ssl", "1");

// Set authentication properties (personal access token)
connectionProperties.put("AuthMech", "3");
connectionProperties.put("user", "token");
connectionProperties.put("password", "12345678901234667890abcdabcd");

// Enable geospatial support
connectionProperties.put("EnableComplexDatatypeSupport", "1");
connectionProperties.put("EnableGeoSpatialSupport", "1");

// Establish connection and execute geospatial query
try (Connection connection = DriverManager.getConnection(jdbcUrl, connectionProperties);
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(
"SELECT ST_Point(1.0, 2.0) as point, " +
"ST_GeogFromText('POINT(-122.4194 37.7749)') as location")) {

while (rs.next()) {
// Retrieve GEOMETRY object
IGeometry point = (IGeometry) rs.getObject("point");
System.out.println("Point WKT: " + point.getWKT());
System.out.println("Point SRID: " + point.getSRID());

// Retrieve GEOGRAPHY object
IGeography location = (IGeography) rs.getObject("location");
System.out.println("Location WKT: " + location.getWKT());
System.out.println("Location SRID: " + location.getSRID());

// Metadata
ResultSetMetaData meta = rs.getMetaData();
System.out.println("Column 1 type: " + meta.getColumnTypeName(1)); // GEOMETRY
System.out.println("Column 1 class: " + meta.getColumnClassName(1)); // com.databricks.jdbc.api.IGeometry
System.out.println("Column 2 type: " + meta.getColumnTypeName(2)); // GEOGRAPHY
System.out.println("Column 2 class: " + meta.getColumnClassName(2)); // com.databricks.jdbc.api.IGeography
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

Exemple : Utilisation des transactions

Les transactions multi-déclarations regroupent plusieurs instructions SQL en une seule unité atomique. Toutes les déclarations réussissent ensemble ou échouent ensemble. Les tables doivent avoir les commits de catalogue activés.

L'exemple suivant transfère des fonds entre deux comptes. Les deux instructions UPDATE s'exécutent comme une seule unité atomique. Si l'une ou l'autre échoue, l'annulation empêche les mises à jour partielles.

Java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.SQLException;

public class DatabricksTransactionExample {

public static void main(String[] args) {

String jdbcUrl = "jdbc:databricks://dbc-a1b2345c-d6e7.cloud.databricks.com/default;" +
"transportMode=http;" +
"ssl=1;" +
"AuthMech=3;" +
"httpPath=sql/1.0/warehouses/abc123def456;" +
"uid=token;" +
"pwd=your-access-token";

try (Connection connection = DriverManager.getConnection(jdbcUrl);
Statement stmt = connection.createStatement()) {

connection.setAutoCommit(false);

try {
stmt.executeUpdate(
"UPDATE accounts SET balance = balance - 100.00 WHERE account_id = 'ACC001'");
stmt.executeUpdate(
"UPDATE accounts SET balance = balance + 100.00 WHERE account_id = 'ACC002'");
stmt.executeUpdate(
"INSERT INTO audit_log VALUES ('ACC001', 'ACC002', 100.00, current_timestamp())");

connection.commit();

} catch (SQLException e) {
connection.rollback();
throw e;
}

} catch (SQLException e) {
e.printStackTrace();
}
}
}

Lors de l'utilisation de transactions avec JDBC :

  • Appelez commit() ou rollback() explicitement avant de fermer les connexions.
  • Préférez les méthodes JDBC (setAutoCommit(), commit(), rollback()) aux commandes SQL pour une meilleure portabilité.
  • Ne partagez pas une seule connexion entre plusieurs threads — créez une connexion distincte pour chaque thread.

Pour plus d'informations sur les transactions, consultez Transactions.