Gestion des connexions¶
Pour exécuter des instructions vis-à-vis de Snowflake, vous devez d’abord établir une connexion. Le pilote Snowflake Node.js vous permet d’établir des connexions comme suit :
Important
À partir de la version 8.24 de Snowflake, les administrateurs réseau ont la possibilité d’exiger une authentification multifactorielle (MFA) pour toutes les connexions à Snowflake. Si votre administrateur décide d’activer cette fonctionnalité, vous devez configurer votre client ou votre pilote pour l’utiliser la MFA lors de la connexion à Snowflake. Pour plus d’informations, voir les ressources suivantes :
Création d’une connexion unique¶
Pour créer une connexion unique à Snowflake :
Appelez
snowflake.createConnection
pour créer un nouvel objetConnection
et transmettez un objet JavaScript qui spécifie les options de connexion.En utilisant l’objet
Connection
, appelez la méthodeconnect
pour établir une connexion.Note
Si vous attribuez à l’option
authenticator
la valeurEXTERNALBROWSER
(afin d’utiliser SSO basé sur le navigateur) ouhttps://<nom_compte_okta>.okta.com
(afin d’utiliser SSO natif d’Okta), appelez la méthodeconnectAsync
plutôt que la méthodeconnect
.Pour gérer les erreurs de connexion, transmettez une fonction de rappel qui a la signature suivante :
function(err, conn)
où :
err
est un objet JavaScriptError
.conn
est l’objetConnection
actuel.
Si une erreur se produit pendant la connexion, la méthode
connect
transmet un objetError
à votre fonction de rappel. Vous pouvez utiliser cet objet dans votre fonction de rappel pour obtenir des détails sur l’erreur. Si vous avez besoin d’informations sur l’objetConnection
actuel, vous pouvez utiliser l’argumentconn
transmis à votre fonction de rappel.
L’exemple suivant établit une connexion et utilise un mot de passe pour l’authentification. Pour utiliser d’autres méthodes d’authentification, voir Options d’authentification.
// Load the Snowflake Node.js driver. var snowflake = require('snowflake-sdk');// Create a Connection object that we can use later to connect. var connection = snowflake.createConnection({ account: account, username: user, password: password, application: application });// Try to connect to Snowflake, and check whether the connection was successful. connection.connect( function(err, conn) { if (err) { console.error('Unable to connect: ' + err.message); } else { console.log('Successfully connected to Snowflake.'); // Optional: store the connection ID. connection_ID = conn.getId(); } } );
Lors de la création d’une connexion, vous pouvez définir les options de connexion comme décrit dans Référence des options.
Vérification qu’une connexion est prête à recevoir des requêtes¶
Avant de soumettre des requêtes à Snowflake, vous pouvez utiliser la méthode connection.isValidAsync()
(à partir de la version 1.6.23) pour vous assurer que la connexion est établie et prête à exécuter des requêtes sur Snowflake. La méthode renvoie true
si la connexion est prête ou false
dans le cas contraire.
// Create a Connection object and connect to Snowflake
// ..
// Verify if connection is still valid for sending queries over it
const isConnectionValid = await connection.isValidAsync();
// Do further actions based on the value (true or false) of isConnectionValid
Création d’un pool de connexion¶
Au lieu de créer une connexion chaque fois que votre application cliente doit accéder à Snowflake, vous pouvez définir un cache de connexions Snowflake à réutiliser selon les besoins. Le pooling de connexions réduit généralement le temps de latence nécessaire pour établir une connexion. Toutefois, cela peut ralentir le basculement du client vers un DNS alternatif lorsqu’un problème de DNS se produit.
Pour créer un pool de connexion :
Appelez
snowflake.createPool(connectionOptions, poolOptions)
pour créer un nouvel objetConnectionPool
, et transmettez deux objets JavaScript qui spécifient les options de connexion et les options de mutualisation.Note
Le pilote Snowflake Node.js utilise la bibliothèque open-source node-pool pour mettre en œuvre des pools de connexion. Pour plus d’informations sur les
poolOptions
prises en charge, consultez la description de l’argumentopts
dans la documentation de la bibliothèque node-pool.Avec l’objet
ConnectionPool
, appelez la fonctionuse
pour exécuter des instructions pour une seule connexion dans le pool de connexion.Pour gérer les erreurs de connexion, transmettez une fonction de rappel qui a la signature suivante :
function(err, stmt, rows)
où :
err
est un objet JavaScriptError
.stmt
est un objet contenant des informations sur l’instruction SQL qui a été exécutée, y compris le texte littéral de l’instruction.rows
est un tableau contenant le « jeu de résultats » de l’instruction.
Si une erreur se produit pendant l’exécution de l’instruction, la méthode
connect
transmet un objetError
à votre fonction de rappel. Vous pouvez utiliser cet objet dans votre fonction de rappel pour obtenir des détails sur l’erreur.
L’exemple suivant crée un pool de connexion qui prend en charge un maximum de dix connexions actives. Il utilise un mot de passe pour l’authentification. Pour utiliser d’autres méthodes d’authentification, voir Options d’authentification.
// Create the connection pool instance const connectionPool = snowflake.createPool( // connection options { account: account, username: user, password: password }, // pool options { max: 10, // specifies the maximum number of connections in the pool min: 0 // specifies the minimum number of connections in the pool } );
L’exemple suivant utilise la méthode connectionPool.use
pour exécuter une instruction SQL en utilisant les connexions du pool. La méthode clientConnection.execute
spécifie l’instruction SQL à exécuter et définit une fonction de rappel.
// Use the connection pool and execute a statement connectionPool.use(async (clientConnection) => { const statement = await clientConnection.execute({ sqlText: 'select 1;', complete: function (err, stmt, rows) { var stream = stmt.streamRows(); stream.on('data', function (row) { console.log(row); }); stream.on('end', function (row) { console.log('All rows consumed'); }); } }); });
Lors de la création d’un pool de connexion, vous pouvez définir les options de connexion comme décrit dans Référence des options.
Gestion des connexions inactives¶
Avec le paramètre par défaut de l’option evictionRunIntervalMillis
du pool de nœuds défini sur 0, les contrôles d’éviction des connexions inactives ne sont pas exécutés. Si vous avez une application qui fonctionne depuis longtemps, ce comportement peut conduire à ce que des connexions terminées restent dans le pool de connexions, ce qui provoque une erreur lorsque le pilote les acquiert et tente d’envoyer une requête à Snowflake par leur intermédiaire.
Pour remédier à ce comportement dans une application de longue durée, vous pouvez envisager les solutions suivantes :
Créez le Snowflake
ConnectionPool
avec un expulseur activé.Vous pouvez ajouter l’option
evictionRunIntervalMillis
aux options du pool, comme le montre l’exemple suivant :const pool = snowflake.createPool( { account: account, username: username, //rest of the connection options }, { evictionRunIntervalMillis: 60000 // default = 0, off idleTimeoutMillis: 60000, // default = 30000 max: 2, min: 0, }, );
Cet exemple exécute l’expulseur toutes les minutes et élimine toutes les connexions restées inactives pendant plus d’une minute. Vous pouvez également modifier
numTestsPerEvictionRun
(par défaut : 3) pour changer le nombre de ressources vérifiées lors de chaque éviction.Voir la
documentation de la bibliothèque de pool de nœuds < https://github.com/coopernurse/node-pool/blob/master/README.md>
pour plus de détails et d’options.Maintenir les connexions existantes en vie dans le pool
Si vous devez maintenir une connexion en vie plus souvent que toutes les heures, vous pouvez ajouter les éléments suivants aux options du pool :
clientSessionKeepAlive : vrai
clientSessionKeepAliveHeartbeatFrequency : n
, oùn
est compris entre 900 (15 min.) et 3 600 (1 h) secondes (par défaut : 3 600).
L’exemple suivant envoie un battement de cœur toutes les 15 minutes pour maintenir la connexion même en l’absence de toute autre activité, telle qu’une requête d’un client.
const pool = snowflake.createPool( { account: account, username: username, // rest of the connection options clientSessionKeepAlive: true, // default = false clientSessionKeepAliveHeartbeatFrequency: 900 // default = 3600 }, { max: 2, min: 0, }, );
Vous pouvez également utiliser l’option
clientSessionKeepAlive
sans utiliser de connexions groupées.Pour plus d’informations sur le maintien de la session, voir Référence des options Node.js.
Connexion par l’intermédiaire d’un proxy¶
Vous pouvez vous connecter à Snowflake par l’intermédiaire d’un proxy, en fournissant les détails comme options de connexion lors de la création d’un objet Connection
.
L’exemple suivant montre comment se connecter à un proxy en utilisant HTTP :
var connection = snowflake.createConnection({
account: "account",
username: "user",
password: "password",
proxyHost: "localhost",
proxyPort: 3128,
});
À partir de la version 1.15.0, le pilote Snowflake Node.js supporte entièrement les variables d’environnement HTTP_PROXY
, HTTPS_PROXY
et NO_PROXY
en plus de leurs paramètres de connexion correspondants.
Par défaut, le nouveau paramètre de configuration globale useEnvProxy
est défini sur vrai
, ce qui permet la prise en charge des variables d’environnement.
Avec la possibilité de définir ces proxy à la fois dans l’objet Connexion
et dans les variables d’environnement, le pilote utilise la hiérarchie suivante pour déterminer les valeurs à utiliser :
Si un proxy est défini dans le
Connexion
, il a la priorité. Le pilote ignore les variables d’environnementHTTP_PROXY
etHTTPS_PROXY
.Si la connexion ne définit pas les valeurs du proxy, le pilote utilise les valeurs des variables d’environnement
HTTP_PROXY
etHTTPS_PROXY
si elles sont définies.Si le paramètre de connexion
useEnvProxy
est défini surfaux
, le pilote ignore les variables d’environnementHTTP_PROXY
etHTTPS_PROXY
si elles sont définies.
Si vous souhaitez désactiver la prise en charge des variables d’environnement de proxy, vous devez la désactiver dans la configuration globale, comme suit :
const snowflake=require('snowflake-sdk');
snowflake.configure({ useEnvProxy: false });
Note
Les variables d’environnement sont sensibles à la casse sous Linux et MacOS. Sous Windows, ce n’est pas le cas.
Si les variantes en minuscules (
https_proxy
) et en majuscules (HTTPS_PROXY
) sont définies pour la même variable d’environnement, le pilote utilise la valeur de la variable en minuscules (https_proxy
).Si seule la variante en majuscules (
HTTPS_PROXY
) est présente, le pilote utilise la valeur de la variable en majuscules.
Connexion par le biais d’un proxy authentifié¶
Vous pouvez vous connecter à Snowflake par le biais d’un proxy authentifié en fournissant des identifiants de connexion d’authentification comme options de connexion lors de la création d’un objet Connection
.
Note
La connexion via un serveur proxy authentifié est prise en charge à partir de la version 1.6.4 du pilote Snowflake Node.js.
L’exemple suivant montre comment se connecter à un proxy authentifié en utilisant HTTP :
var connection = snowflake.createConnection({
account: "account",
username: "user",
password: "password",
proxyHost: "localhost",
proxyPort: 3128,
proxyUser: "myname",
proxyPassword: "mypass"
});
Pour se connecter à un proxy authentifié à l’aide de HTTPS, vous devez également fournir la propriété de connexion proxyProtocol
comme indiqué ci-dessous :
var connection = snowflake.createConnection({
account: "account",
username: "user",
password: "password",
proxyHost: "localhost",
proxyPort: 3128,
proxyUser: "myname",
proxyPassword: "mypass",
proxyProtocol: "https"
});
Vérification de la connexion réseau à Snowflake avec SnowCD¶
Après avoir configuré votre pilote, vous pouvez évaluer et dépanner votre connectivité réseau à Snowflake en utilisant SnowCD.
Vous pouvez utiliser SnowCD pendant le processus de configuration initiale et à la demande à tout moment pour évaluer et dépanner votre connexion réseau à Snowflake.
OCSP (Online Certificate Status Protocol)¶
Lorsque le pilote se connecte, Snowflake envoie un certificat confirmant que la connexion est établie avec Snowflake plutôt qu’avec un hôte empruntant l’identité de Snowflake. Le pilote envoie ce certificat à un serveur OCSP (protocole de statut de certificat en ligne) pour vérifier que le certificat n’a pas été révoqué.
Si le pilote ne peut pas atteindre le serveur OCSP pour vérifier le certificat, il peut entrainer un comportement « Fail open » ou « Fail closed ».
Mettre fin à une connexion¶
Une connexion peut être interrompue en utilisant la méthode connection.destroy()
. Ceci met fin immédiatement à la session associée à la connexion sans attendre la fin des instructions en cours d’exécution :
connection.destroy(function(err, conn) { if (err) { console.error('Unable to disconnect: ' + err.message); } else { console.log('Disconnected connection with id: ' + connection.getId()); } });