Ce guide explique comment télécharger le pilote MaxCompute JDBC et se connecter à MaxCompute. Il inclut des exemples de code pour vous aider à démarrer.
Précautions
-
Pour exécuter des instructions SQL et obtenir les résultats d'exécution à l'aide du pilote MaxCompute JDBC, respectez les exigences suivantes :
Vous êtes membre d'un projet.
Vous disposez de l'autorisation CREATE INSTANCE sur le projet.
-
Vous disposez des autorisations SELECT et DOWNLOAD sur la table que vous souhaitez utiliser.
RemarqueAvec MaxCompute JDBC V1.9 ou une version antérieure, une table temporaire est automatiquement créée pour chaque requête. Utilisez les commandes Tunnel pour obtenir les résultats de la requête à partir de la table temporaire. Pour utiliser ces versions, vous devez disposer de l'autorisation CREATE TABLE.
Avec MaxCompute JDBC V2.2 ou une version ultérieure, aucune table temporaire n'est automatiquement créée pour chaque requête. Appelez l'interface InstanceTunnel pour obtenir les résultats de la requête, que vous disposiez ou non de l'autorisation CREATE TABLE.
Pour plus d'informations sur les autorisations MaxCompute, consultez Autorisations MaxCompute.
MaxCompute propose la fonctionnalité de protection des données. Si cette fonctionnalité est activée pour un projet, vous ne pouvez pas déplacer les données hors du projet. Avec une version de MaxCompute JDBC antérieure à la V2.4, aucun
result setsne peut être obtenu. Avec MaxCompute JDBC V2.4 ou une version ultérieure, le nombre de lignes de résultat obtenues ne peut pas dépasser la valeur du paramètre READ_TABLE_MAX_ROW. Pour plus d'informations sur ce paramètre, consultez Opérations sur les projets. Pour plus d'informations sur la fonctionnalité de protection des données, consultez Protection des données du projet.
-
L'édition des types de données MaxCompute V2.0 prend en charge davantage de types de données, tels que TINYINT, SMALLINT, DATETIME, TIMESTAMP, ARRAY, MAP et STRUCT. Pour utiliser ces nouveaux types de données, exécutez la commande suivante afin d'activer l'édition des types de données MaxCompute V2.0. Pour plus d'informations, consultez Guide des versions des types de données.
set odps.sql.type.system.odps2=true Avec JDBC V3.4.1 et versions ultérieures, si vos requêtes SQL sont longues (supérieures à 1 Ko), contrôlez attentivement la concurrence. Par exemple, avec une instance ECS dotée de 8 vCPU et de 16,0 GiB de mémoire, la concurrence ne doit pas dépasser 100. Si vous ne pouvez pas contrôler efficacement la concurrence, mettez à niveau JDBC vers la V3.8.8 ou la V3.9.3 et définissez
skipCheckIfSelect=truepour désactiver la fonctionnalité d'analyse SQL. Pour plus d'informations sur cette fonctionnalité, consultez Mises à jour de version.
Télécharger le pilote JDBC
Obtenez les packages JAR MaxCompute pour différentes versions depuis OSS, GitHub ou le référentiel Maven. Nous vous recommandons de télécharger le package JAR qui inclut toutes les dépendances (jar-with-dependencies).
L'exemple suivant montre la dépendance Project Object Model (POM) pour utiliser le pilote MaxCompute JDBC avec Maven.
<dependency>
<groupId>com.aliyun.odps</groupId>
<artifactId>odps-jdbc</artifactId>
<version>3.8.6</version>
<classifier>jar-with-dependencies</classifier>
</dependency>
Le pilote MaxCompute JDBC est un projet open source disponible à l'adresse aliyun-odps-jdbc.
Vos contributions au développement et à l'amélioration du pilote JDBC sont les bienvenues. Signalez des problèmes sur la page Issues ou contribuez à l'amélioration du code via les Pull requests. Lors de l'utilisation des Issues et des Pull requests, respectez les exigences de modèle du projet.
Paramètres JDBC
Configurez JDBC à l'aide des paramètres URL et des objets Properties. Les objets Properties ont une priorité plus élevée et remplacent les paramètres URL.
Si la clé URL contient odps_config=config_file, JDBC lit config_file comme paramètres Properties.
-
Paramètres de base
Clé URL
Clé Property
Obligatoire
Description
project
project_name
Oui
Nom du projet MaxCompute.
accessId
access_id
Oui
ID de la clé AccessKey de votre compte Alibaba Cloud.
Obtenez votre ID de clé AccessKey sur la page Gestion des clés AccessKey.
accessKey
access_key
Oui
Secret de la clé AccessKey de votre compte Alibaba Cloud.
Obtenez le secret de votre clé AccessKey sur la page Gestion des clés AccessKey.
logview
logview_host
Non
URL de MaxCompute LogView. La valeur est fixée à
http://logview.odps.aliyun.com.tunnelEndpoint
tunnel_endpoint
Non
Endpoint du service MaxCompute Tunnel.
Pour connaître les endpoints Tunnel pour chaque région et type de réseau, consultez Endpoints.
-
Paramètres de configuration des journaux
Clé URL
Clé Property
Obligatoire
Description
enableOdpsLogger
enable_odps_logger
Non
Indique s'il faut activer le journaliseur MaxCompute JDBC. Valeurs possibles :
False (par défaut) : Désactive le journaliseur.
True : Activé. Les journaux sont écrits dans le fichier
jdbc.logsitué dans le répertoire du package JAR.
logConfFile
log_conf_file
Non
Spécifiez un fichier de configuration SLF4J supplémentaire pour configurer de manière flexible la sortie des journaux, tels que le fichier de sortie et le logLevel. Cette méthode nécessite d'ajouter les dépendances suivantes au fichier
pom.xmlde votre projet :<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>Pour un exemple de configuration, consultez Exemple de fichier de configuration.
logLevel
log_level
Non
Niveau de journalisation de la sortie. Valeur par défaut : INFO.
-
Autres paramètres
Clé URL
Clé Property
Obligatoire
Description
stsToken
sts_token
Non
Jeton STS Alibaba Cloud.
charset
charset
Non
Jeu de caractères pour l'entrée et la sortie. Valeur par défaut : UTF-8.
useProjectTimeZone
use_project_time_zone
Non
Indique s'il faut utiliser la propriété
odps.sql.timezonedu projet. Valeurs possibles :False (par défaut) : N'utilise pas la propriété.
True : Utilise la propriété.
RemarqueVous pouvez également spécifier le fuseau horaire dans une instruction à l'aide de
set odps.sql.timezone=xxx.Ordre de priorité : Instruction > projet > null.
disableConnectionSetting
disable_connection_setting
Non
Indique s'il est autorisé de définir des paramètres SQL pour une connexion. Valeurs possibles :
False (par défaut) : Non autorisé.
True : Autorisé.
Lorsque ce paramètre est défini sur true, la commande
set xxxs'applique à la fois à l'instruction et à la connexion. Sinon, elle s'applique uniquement à l'instruction.settings
settings
Non
Chaîne JSON pour le paramètre
sql settingglobal par défaut. Exemple :{"key":"value"}.tableList
table_list
Non
Noms des tables MaxCompute. Format :
projectname.tablename,projectname1.tablename1.connectTimeout
connect_timeout
Non
Délai d'attente pour l'établissement d'une connexion réseau. Valeur par défaut : 10 secondes (s).
readTimeout
read_timeout
Non
Délai d'attente pour la lecture des données depuis une connexion réseau. Valeur par défaut : 120 secondes (s).
RemarqueLe délai d'attente total pour chaque requête API RESTful est la somme de connectTimeout et readTimeout, soit 130 secondes par défaut. Le pilote réessaie chaque requête jusqu'à 3 fois.
Pour ajuster le délai d'attente de connexion pour les requêtes API RESTful, modifiez le paramètre readTimeout.
enableCommandApi
enable_command_api
Non
Indique s'il faut utiliser l'API de commande. Valeurs possibles :
False (par défaut) : L'API de commande n'est pas utilisée.
True : L'API de commande est utilisée.
Une fois activée, vous pouvez exécuter des commandes dans JDBC qui sont normalement exclusives à odpscmd.
httpsCheck
https_check
Non
Indique s'il faut effectuer la vérification du certificat HTTPS. Valeurs possibles :
False (par défaut) : La vérification n'est pas effectuée.
True : La vérification est effectuée.
tunnelConnectTimeout
tunnel_connect_timeout
Non
Délai d'attente de connexion pour Tunnel lors du téléchargement des données. Valeur par défaut : 180 secondes (s).
tunnelReadTimeout
tunnel_read_timeout
Non
Délai d'attente de lecture pour Tunnel lors du téléchargement des données. Valeur par défaut : 300 secondes (s).
skipCheckIfSelect
skipCheckIfSelect
Non
Indique s'il faut ignorer l'analyse SQL. Valeurs possibles :
False (par défaut) : N'ignore pas l'analyse.
True : Ignore l'analyse.
RemarqueIgnorer l'analyse peut réduire la consommation de CPU et de mémoire côté client, mais peut augmenter la latence pour les instructions autres que SELECT.
-
Paramètres non-MCQA (effectifs uniquement en mode hors ligne)
Clé URL
Clé Property
Obligatoire
Description
autoLimitFallback
auto_limit_fallback
Non
Repli automatique de limite. Valeurs possibles :
False (par défaut) : Pas de repli.
True : Repli. En mode hors ligne, lorsque Tunnel signale une exception
no download permission, le pilote effectue automatiquement un repli et limite le nombre d'enregistrements téléchargés à 10 000.
-
Paramètres MaxQA/MCQA 1.0 (effectifs uniquement pour MaxQA/MCQA 1.0)
Configuration de base
False (par défaut) : Désactivé.
True : Activé.
-
Paramètres liés aux limites
Clé URL
Clé Property
Obligatoire
Description
instanceTunnelMaxRecord
instance_tunnel_max_record
Non
Nombre maximal d'enregistrements dans l'ensemble de résultats.
RemarqueCe paramètre prend effet uniquement lorsque le paramètre enableLimit est défini sur False.
instanceTunnelMaxSize
instance_tunnel_max_size
Non
Taille maximale de l'ensemble de résultats. Unité : octet.
autoSelectLimit
auto_select_limit
Non
Limite de requête automatique.
Par défaut, vous pouvez interroger un maximum de 1 000 000 de lignes dans les environnements de cloud public Alibaba Cloud. Pour interroger plus de données, configurez ce paramètre.
RemarqueCe paramètre prend effet uniquement lorsque le paramètre enableLimit est défini sur False.
Avec JDBC V3.2.29 et versions ultérieures, si vous définissez le paramètre autoSelectLimit, le paramètre enableLimit est automatiquement défini sur False.
enableLimit
enable_limit
Non
Indique s'il faut activer la limite. Valeurs possibles :
False : La limite n'est pas activée.
True (par défaut) : La limite est activée.
Si elle est activée, l'autorisation de téléchargement n'est pas vérifiée et les ensembles de résultats sont limités à 10 000 enregistrements par défaut.
-
Paramètres liés au repli
Clé URL
Clé Property
Obligatoire
Description
fallbackForUnknownError
fallback_for_unknownerror
Non
Indique s'il faut revenir au mode hors ligne en cas d'erreur inconnue. Valeurs possibles :
False : Pas de repli.
True (par défaut) : Repli.
fallbackForResourceNotEnough
fallback_for_resourcenotenough
Non
Indique s'il faut revenir au mode hors ligne en cas de ressources insuffisantes. Valeurs possibles :
False : Pas de repli.
True (par défaut) : Repli.
fallbackForUpgrading
fallback_for_upgrading
Non
Indique s'il faut revenir au mode hors ligne pendant une mise à niveau. Valeurs possibles :
False : Pas de repli.
True (par défaut) : Repli.
fallbackForRunningTimeout
fallback_for_runningtimeout
Non
Indique s'il faut revenir au mode hors ligne en cas de dépassement du délai d'attente d'une commande d'opération. Valeurs possibles :
False : Pas de repli.
True (par défaut) : Repli.
fallbackForUnsupportedFeature
fallback_for_unsupported_feature
Non
Indique s'il faut revenir au mode hors ligne lorsqu'une fonctionnalité MCQA non prise en charge est utilisée. Valeurs possibles :
False : Pas de repli.
True (par défaut) : Repli.
alwaysFallback
always_fallback
Non
Indique s'il faut revenir au mode hors ligne dans tous les scénarios précédents. Valeurs possibles :
False (par défaut) : Pas de repli.
True : Repli.
RemarqueCe paramètre est pris en charge uniquement dans JDBC V3.2.3 et versions ultérieures.
disableFallback
disable_fallback
Non
Indique s'il faut désactiver le repli vers le mode hors ligne dans tous les scénarios précédents. Valeurs possibles :
False (par défaut) : Repli.
True : Pas de repli.
fallbackQuota
fallback_quota
Non
Nom du quota vers lequel une tâche MCQA effectue un repli. S'il n'est pas configuré, le quota par défaut du projet est utilisé.
Clé URL
Clé Property
Obligatoire
Description
interactiveMode
interactive_mode
Non
Indique s'il faut activer MaxQA/MCQA 1.0. Valeurs possibles :
executeProject
execute_project_name
Non
Nom du projet MaxCompute où la tâche SQL s'exécute réellement.
tunnelRetryTime
tunnel_retry_time
Non
Nombre de tentatives Tunnel pour SQLExecutor. Valeur par défaut : 6.
attachTimeout
attach_timeout
Non
Délai d'attente pour l'établissement d'une connexion MCQA 1.0. Valeur par défaut : 60 secondes (s).
fallbackQuota
fallback_quota
Non
Quota à utiliser lorsqu'une tâche MCQA 1.0 effectue un repli. S'il n'est pas configuré, le quota par défaut du projet est utilisé.
quotaName
quota_name
Non
Quota de ressources de calcul utilisé par la tâche MaxQA.
Se connecter à MaxCompute
-
Chargez le pilote MaxCompute JDBC.
Class.forName("com.aliyun.odps.jdbc.OdpsDriver"); -
Créez une connexion à l'aide de DriverManager.
Connection cnct = DriverManager.getConnection(url, accessId, accessKey);-
url : L'URL doit être au format suivant :
jdbc:odps:<maxcompute_endpoint>?project=<maxcompute_project_name>[&useProjectTimeZone={true|false}]. Les paramètres sont décrits ci-dessous :<maxcompute_endpoint> : Endpoint du service MaxCompute pour la région. Par exemple, l'endpoint public pour la région Chine (Hangzhou) est
http://service.cn-hangzhou.maxcompute.aliyun.com/api. Pour plus d'informations, consultez Endpoints.<maxcompute_project_name> : Nom du projet MaxCompute.
useProjectTimeZone : Indique s'il faut utiliser le fuseau horaire du projet MaxCompute.
Exemple :
jdbc:odps:http://service.cn-hangzhou.maxcompute.aliyun.com/api?project=test_project&useProjectTimeZone=true; accessId : ID de la clé AccessKey de votre compte Alibaba Cloud.
-
accessKey : Secret de la clé AccessKey correspondant à l'ID de la clé AccessKey.
RemarquePour créer et afficher un ID de clé AccessKey et un secret de clé AccessKey, consultez Préparer un compte Alibaba Cloud.
-
-
Exécutez une requête.
try ( Statement stmt = cnct.createStatement(); ResultSet rset = stmt.executeQuery("SELECT foo FROM bar;") ) { while (rset.next()) { // process the results } } catch (SQLException e) { // handle the exception } finally { if (cnct != null) { try { cnct.close(); } catch (SQLException e) { // Ignore or record a closed exception } } }
Exemples de code
-
Supprimer une table, créer une table et obtenir des métadonnées
RemarqueSi vous ajoutez la dépendance JDBC à votre projet, n'ajoutez pas séparément la dépendance SDK. La dépendance JDBC inclut le SDK requis et l'ajouter séparément peut provoquer des erreurs d'incompatibilité de version.
import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Main { private static final String DRIVER_NAME = "com.aliyun.odps.jdbc.OdpsDriver"; // An Alibaba Cloud account's AccessKey pair has permissions for all API operations, which is a security risk. We strongly recommend using a RAM user for API access or routine O&M. To create a RAM user, log on to the RAM console. // This example stores the AccessKey ID and AccessKey secret in environment variables. You can also store them in a configuration file based on your business requirements. // For security, do not hardcode the AccessKey ID and AccessKey secret in your code. private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); public static void main(String[] args) { try { Class.forName(DRIVER_NAME); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } try ( Connection conn = DriverManager.getConnection( "jdbc:odps:<maxcompute_endpoint>?project=<maxcompute_project>", Main.accessId, Main.accessKey); Statement stmt = conn.createStatement() ) { // create a table final String tableName = "jdbc_test"; stmt.execute("DROP TABLE IF EXISTS " + tableName); stmt.execute("CREATE TABLE " + tableName + " (key BIGINT, value STRING)"); // get meta data DatabaseMetaData metaData = conn.getMetaData(); System.out.println("product = " + metaData.getDatabaseProductName()); System.out.println("jdbc version = " + metaData.getDriverMajorVersion() + ", " + metaData.getDriverMinorVersion()); try (ResultSet tables = metaData.getTables(null, "default", tableName, null)) { while (tables.next()) { String name = tables.getString("TABLE_NAME"); System.out.println("inspecting table: " + name); try (ResultSet columns = metaData.getColumns(null, null, name, null)) { while (columns.next()) { System.out.println( columns.getString("COLUMN_NAME") + "\t" + columns.getString("TYPE_NAME") + "(" + columns.getInt("DATA_TYPE") + ")"); } } } } } catch (SQLException e) { e.printStackTrace(); } } }Exemple de sortie :
product = MaxCompute/ODPS jdbc version = 3, 8 inspecting table: jdbc_test key BIGINT(-5) value STRING(12) -
Mettre à jour une table
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class Main { private static final String DRIVER_NAME = "com.aliyun.odps.jdbc.OdpsDriver"; // An Alibaba Cloud account's AccessKey pair has permissions for all API operations, which is a security risk. We strongly recommend using a RAM user for API access or routine O&M. To create a RAM user, log on to the RAM console. // This example stores the AccessKey ID and AccessKey secret in environment variables. You can also store them in a configuration file based on your business requirements. // For security, do not hardcode the AccessKey ID and AccessKey secret in your code. private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); public static void main(String[] args) { try { Class.forName(DRIVER_NAME); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } try ( Connection conn = DriverManager.getConnection( "jdbc:odps:<maxcompute_endpoint>?project=<maxcompute_project>", Main.accessId, Main.accessKey); Statement stmt = conn.createStatement() ) { // The following DML also works // String dml = "INSERT INTO jdbc_test SELECT 1, \"foo\""; String dml = "INSERT INTO jdbc_test VALUES(1, \"foo\")"; int ret = stmt.executeUpdate(dml); assert ret == 1; } catch (SQLException e) { e.printStackTrace(); } } } -
Mettre à jour une table par lots
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class Main { private static final String DRIVER_NAME = "com.aliyun.odps.jdbc.OdpsDriver"; // An Alibaba Cloud account's AccessKey pair has permissions for all API operations, which is a security risk. We strongly recommend using a RAM user for API access or routine O&M. // This example stores the AccessKey ID and AccessKey secret in environment variables. You can also store them in a configuration file based on your business requirements. // For security, do not hardcode the AccessKey ID and AccessKey secret in your code. private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); public static void main(String[] args) { try { Class.forName(DRIVER_NAME); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } try ( Connection conn = DriverManager.getConnection( "jdbc:odps:<maxcompute_endpoint>?project=<maxcompute_project>", Main.accessId, Main.accessKey); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO jdbc_test VALUES(?, ?)") ) { // First batch pstmt.setLong(1, 1L); pstmt.setString(2, "foo"); pstmt.addBatch(); // Second batch pstmt.setLong(1, 2L); pstmt.setString(2, "bar"); pstmt.addBatch(); int[] ret = pstmt.executeBatch(); assert ret[0] == 1; assert ret[1] == 1; } catch (SQLException e) { e.printStackTrace(); } } }RemarqueLa méthode executeBatch ne prend pas en charge les écritures par lots dans les tables clusterisées, telles que les tables Transaction Table 2.0.
-
Pour écrire des données dans une table partitionnée standard par lots, spécifiez la partition cible dans l'instruction INSERT INTO. Exemple :
-- The table creation statement for the partitioned table sale_detail is as follows. create table if not exists sale_detail ( shop_name string, customer_id string, total_price double ) partitioned by (sale_date string, region string); -- Assume that the partition sale_date='20240219', region='hangzhou' already exists. The INSERT INTO statement for batch writes to the partitioned table is as follows. INSERT INTO sale_detail PARTITION(sale_date='20240219', region='hangzhou') VALUES(?, ?, ?)
-
Interroger une table
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Main { private static final String DRIVER_NAME = "com.aliyun.odps.jdbc.OdpsDriver"; // An Alibaba Cloud account's AccessKey pair has permissions for all API operations, which is a security risk. We strongly recommend using a RAM user for API access or routine O&M. // This example stores the AccessKey ID and AccessKey secret in environment variables. You can also store them in a configuration file based on your business requirements. // For security, do not hardcode the AccessKey ID and AccessKey secret in your code. private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); public static void main(String[] args) { try { Class.forName(DRIVER_NAME); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } try ( Connection conn = DriverManager.getConnection( "jdbc:odps:<maxcompute_endpoint>?project=<maxcompute_project>", accessId, accessKey); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM JDBC_TEST") ) { while (rset.next()) { System.out.println(rset.getInt(1) + "\t" + rset.getString(2)); } } catch (SQLException e) { e.printStackTrace(); } } }RemarqueOdpsStatement prend en charge trois méthodes :
execute(sql),executeQuery(sql)etexecuteUpdate(sql). Les méthodesexecute(sql)etexecuteQuery(sql)prennent également en charge trois commandes courantes :desc table,show tablesetshow partitions.