Konfigurieren des JDBC-Treibers¶
Unter diesem Thema wird beschrieben, wie der JDBC-Treiber konfiguriert wird, einschließlich des Verbindens mit Snowflake mithilfe des Treibers.
Unter diesem Thema:
JDBC-Treiberklasse¶
Verwenden Sie net.snowflake.client.jdbc.SnowflakeDriver
als Treiberklasse in Ihrer JDBC-Anwendung.
Bemerkung
Verweisen Sie in Ihrem Anwendungscode nicht auf andere Snowflake-Klassen oder -Methoden, da diese in Zukunft geändert werden können, um Verbesserungen und Korrekturen zu implementieren.
Die vorherige Treiberklasse
com.snowflake.client.jdbc.SnowflakeDriver
wird weiterhin unterstützt, ist aber veraltet (d. h. sie wird in einer zukünftigen Version entfernt, TBD). Daher funktioniert jeder Code, der auf den vorherigen Klassennamen verweist, auch weiterhin. Sie sollten aber nach Implementierung der Änderung den Code aktualisieren, um auf den neuen Klassennamen zu verweisen.
Verbindungszeichenfolge für den JDBC-Treiber¶
Die Verwendung des JDBC-Treibers zur Verbindung mit Snowflake erfordert eine Verbindungszeichenfolge mit der folgenden Syntax.
Syntax¶
jdbc:snowflake://<account_name>.snowflakecomputing.com/?<connection_params>
Verbindungsparameter¶
<Kontoname>
Gibt den vollen Namen Ihres Kontos an (bereitgestellt von Snowflake). Beachten Sie, dass Ihr vollständiger Kontoname möglicherweise zusätzliche Segmente enthält, die die Region und die Cloudplattform angeben, wo Ihr Konto gehostet wird.
Beispiele für Kontonamen nach Region
Wenn Ihr Kontoname beispielsweise
xy12345
ist:Cloudplattform/Region
Vollständiger Kontoname
AWS
US West (Oregon)xy12345
US East (Ohio)xy12345.us-east-2.aws
US East (N. Virginia)xy12345.us-east-1
US East (Commercial Gov - N. Virginia)xy12345.us-east-1-gov.aws
Canada (Central)xy12345.ca-central-1.aws
EU (Irland)xy12345.eu-west-1
EU (Frankfurt)xy12345.eu-central-1
Asia Pacific (Tokio)xy12345.ap-northeast-1.aws
Asia Pacific (Mumbai)xy12345.ap-south-1.aws
Asia Pacific (Singapur)xy12345.ap-southeast-1
Asia Pacific (Sydney)xy12345.ap-southeast-2
GCP
US Central1 (Iowa)xy12345.us-central1.gcp
Europe West2 (London)xy12345.europe-west2.gcp
Europe West4 (Niederlande)xy12345.europe-west4.gcp
Azure
West US 2 (Washington)xy12345.west-us-2.azure
East US 2 (Virginia)xy12345.east-us-2.azure
US Gov Virginiaxy12345.us-gov-virginia.azure
Canada Central (Toronto)xy12345.canada-central.azure
West Europe (Niederlande)xy12345.west-europe.azure
Switzerland North (Zürich)xy12345.switzerland-north.azure
Southeast Asia (Singapur)xy12345.southeast-asia.azure
Australia East (New South Wales)xy12345.australia-east.azure
Wichtig
Wenn eine der folgenden Bedingungen zutrifft, unterscheidet sich Ihr Kontoname von der oben beschriebenen Struktur:
Wenn Ihre Snowflake Edition VPS ist, wenden Sie sich an den Snowflake-Support, um Details zu Ihrem Kontonamen zu erhalten.
Wenn für Ihr Konto AWS PrivateLink aktiviert ist, muss der Kontoname ein zusätzliches
privatelink
-Segment enthalten. Weitere Details dazu finden Sie unter AWS PrivateLink & Snowflake.
<Regions-ID>
– VeraltetGibt die ID für die Region an, in der sich Ihr Konto befindet.
Dieser Parameter wird nicht mehr verwendet, da die Regionsinformationen, falls erforderlich, Teil des vollständigen Kontonamens sind. Sie ist hier nur aus Gründen der Abwärtskompatibilität dokumentiert.
<Verbindungsparameter>
Gibt eine Reihe von einem oder mehreren Parametern in Form von
<Parameter>=<Wert>
an, wobei jeder Parameter durch das kaufmännische Und-Zeichen (&
) getrennt ist und keine Leerzeichen in der Verbindungszeichenfolge vorhanden sind:user=<Anmeldename>
Gibt den Anmeldenamen des Benutzers für die Verbindung an.
password=<Zeichenfolge>
Gibt das Kennwort für den angegebenen Benutzer an.
Es gibt zwei Möglichkeiten, das Kennwort anzugeben:
Die erste Möglichkeit besteht darin, Benutzer-ID und Kennwort direkt an die
getConnection
-Methode zu übergeben:String user = "<user>"; // replace "<user>" with your user name String password = "<password>"; // replace "<password>" with your password Connection con = DriverManager.getConnection("jdbc:snowflake://<account>.snowflakecomputing.com/", user, password);
Die zweite Möglichkeit besteht darin, ein
Properties
-Objekt zu erstellen, das Objekt mit dem Kennwort zu aktualisieren und das Objekt an diegetConnection
-Methode zu übergeben:String user = "<user>"; // replace "<user>" with your user name String password = "<password>"; // replace "<password>" with your password Properties props = new Properties(); props.put("user", user); props.put("password", password); Connection con = DriverManager.getConnection("jdbc:snowflake://<account>.snowflakecomputing.com/", props);
Achtung
Wir empfehlen dringend, dass Sie das Benutzerkennwort nicht direkt in die JDBC-Verbindungszeichenfolge aufnehmen, da das Kennwort versehentlich von der Clientanwendung, die die Zeichenfolge für die Verbindung zu Snowflake verwendet, angezeigt werden könnte. Verwenden Sie stattdessen die von der Anwendung bereitgestellten Schnittstellen, um das Benutzerkennwort anzugeben.
authenticator=<Zeichenfolge>
Gibt den Authentifikator an, der für die Überprüfung der Anmeldeinformationen des Benutzers verwendet werden soll:
snowflake
, um den internen Snowflake-Authentifikator zu verwenden.externalbrowser
, um den für Ihr Konto definierten Webbrowser für die Authentifizierung mit Okta, ADFS oder einem anderen SAML 2.0-kompatiblen Identitätsanbieter (IdP) zu verwenden.https://<Name_des_Okta-Kontos>.okta.com
(d. h. der URL-Endpunkt für Okta) zum Authentifizieren über das systemeigene Okta (nur unterstützt, wenn Ihr IdP Okta ist).oauth
zum Authentifizieren mit OAuth. Wenn OAuth als Authentifikator angegeben ist, müssen Sie auch den Parametertoken
festlegen, um das OAuth-Token anzugeben (siehe unten).snowflake_jwt
, um die Schlüsselpaar-Authentifizierung zu verwenden. Weitere Informationen zur Schlüsselpaar-Authentifizierung finden Sie unter Verwenden von Schlüsselpaar-Authentifizierung und Schlüsselrotation.
Der Standardwert ist
snowflake
.Wenn die Verbindungszeichenfolge ein Schlüsselpaar angibt, wird die Schlüsselpaar-Authentifizierung auch dann verwendet, wenn der Authentifikatorparameter nicht festgelegt oder auf „snowflake“ gesetzt ist.
Weitere Informationen zur Authentifizierung finden Sie unter Verwenden und Verwalten der Verbundauthentifizierung und OAuth mit Clients, Treibern und Konnektoren.
token=<Zeichenfolge>
Gibt das OAuth-Token an, das für die Authentifizierung verwendet werden soll, wobei
<Zeichenfolge>
das Token ist. Dieser Parameter ist nur erforderlich, wenn der Parameterauthenticator=oauth
eingestellt ist.Der Standardwert ist „none“.
role=<Name>
Gibt die Standardrolle für die Zugriffssteuerung an, die in der vom Treiber initiierten Snowflake-Sitzung verwendet werden soll. Die angegebene Rolle sollte eine bestehende Rolle sein, die dem angegebenen Benutzer des Treibers bereits zugeordnet wurde. Wenn die angegebene Rolle dem Benutzer noch nicht zugewiesen wurde, wird die Rolle nicht verwendet, wenn die Sitzung vom Treiber initiiert wird.
Nach dem Verbinden kann der Befehl USE ROLE ausgeführt werden, um eine andere Rolle für die Sitzung festzulegen.
Weitere Informationen zu Rollen und zur Zugriffssteuerung finden Sie unter Zugriffssteuerung in Snowflake.
db=<Name>
Gibt die Standarddatenbank an, die nach der Verbindung verwendet werden soll, oder eine leere Zeichenfolge. Die angegebene Datenbank sollte eine bestehende Datenbank sein, deren angegebene Standardrolle über entsprechende Berechtigungen verfügt.
Nach dem Verbinden kann der Befehl USE DATABASE ausgeführt werden, um eine andere Datenbank für die Sitzung festzulegen.
schema=<Name>
Gibt das Standardschema an, das nach dem Verbinden für die angegebene Datenbank verwendet werden soll, oder eine leere Zeichenfolge. Das angegebene Schema sollte ein bestehendes Schema sein, für das die angegebene Standardrolle über entsprechende Berechtigungen verfügt.
Nach dem Verbinden kann der Befehl USE SCHEMA ausgeführt werden, um ein anderes Schema für die Sitzung festzulegen.
warehouse=<Name>
Gibt das virtuelle Warehouse an, das nach dem Verbinden verwendet werden soll, oder eine leere Zeichenfolge. Das angegebene Warehouse sollte ein bestehendes Warehouse sein, für das die angegebene Standardrolle über entsprechende Berechtigungen verfügt.
Nach dem Verbinden kann der Befehl USE WAREHOUSE ausgeführt werden, um ein anderes Warehouse für die Sitzung festzulegen.
tracing=<Zeichenfolge>
Gibt den Protokolliergrad für den Treiber an. Der Treiber verwendet das Standard-Java-Protokolldienstprogramm. Gültige Werte für den Protokolliergrad sind:
OFF
,SEVERE
,WARNING
,INFO
,CONFIG
,FINE
,FINER
,FINEST
,ALL
.Der Standardwert ist
INFO
.passcode=<Zeichenfolge>
Gibt die Kennung an, die für die mehrstufige Authentifizierung verwendet werden soll.
Weitere Informationen zur mehrstufigen Authentifizierung finden Sie unter Mehrstufige Authentifizierung (MFA).
passcodeInPassword=<Zeichenfolge>
Gibt an, ob die Kennung für die mehrstufige Authentifizierung an das Kennwort angehängt wird:
on
(odertrue
) gibt an, dass die Kennung angehängt wird.off
(oderfalse
) oder ein anderer Wert gibt an, dass die Kennung nicht angehängt wird.
Der Standardwert ist
off
.loginTimeout
Gibt an, wie lange beim Herstellen einer Verbindung zum Snowflake-Service auf eine Antwort gewartet werden soll, bevor ein Anmeldefehler zurückgegeben wird.
Die Standardeinstellung ist 60 Sekunden.
networkTimeout
Gibt an, wie lange beim Interagieren mit dem Snowflake-Service auf eine Antwort gewartet werden soll, bevor ein Fehler zurückgegeben wird. Null (0) bedeutet, dass kein Netzwerk-Timeout eingestellt ist.
Der Standard ist 0 Sekunden.
queryTimeout=<Zahl>
Gibt an, wie lange auf das Ende einer Abfrage gewartet werden soll, bevor ein Fehler gemeldet wird. Null (0) bedeutet, dass Sie auf unbestimmte Zeit warten müssen.
Der Standard ist 0 Sekunden.
application=<Zeichenfolge>
Snowflake partner use only: Gibt den Namen einer Partneranwendung an, die über JDBC verbunden werden soll.
disableSocksProxy=<Zeichenfolge>
Gibt an, ob der Treiber die in den Java-Systemoptionen angegebene SOCKS-Proxy-Konfiguration ignorieren soll (falls vorhanden):
on
(odertrue
) gibt an, den Proxy zu ignorieren.off
(oderfalse
) oder ein anderer Wert gibt an, dass der Proxy verwendet werden soll.
Der Standardwert ist
off
.Hinweis: Das Einstellen dieses Verbindungsparameters ändert das Verhalten für alle Verbindungen derselben JVM (Java Virtual Machine).
stringsQuotedForColumnDef=<Boolescher_Wert>
Wenn dieser Parameter auf
true
gesetzt ist und DatabaseMetaData.getColumns() und DatabaseMetaData.getProcedureColumns() einen Wert vom TypString
in der Spalte COLUMN_DEF zurückgeben, wird dieser Wert in einfache Anführungszeichen eingeschlossen. (Wenn der Datentyp des Werts nichtString
ist, wird der Wert unabhängig von der Einstellung dieses Parameters nicht in Anführungszeichen gesetzt.)true
gibt an, dass Zeichenfolgenwerte in einfache Anführungszeichen eingeschlossen werden sollen (die Anführungszeichen sind Teil der Zeichenfolge und keine Trennzeichen). Dies entspricht dem JDBC-Standard.false
gibt an, dass Zeichenfolgenwerte nicht in einfache Anführungszeichen eingeschlossen werden.
Der Standardwert ist
false
.
Weitere Parameter¶
Jeder Sitzungsparameter kann in die Verbindungszeichenfolge aufgenommen werden. Beispiel:
CLIENT_SESSION_KEEP_ALIVE=<Boolesch>
Gibt an, ob die aktuelle Sitzung nach einer Zeit der Inaktivität aktiv bleiben soll oder ob der Benutzer gezwungen werden soll, sich erneut anzumelden. Wenn der Wert
true
ist, hält Snowflake die Sitzung auf unbestimmte Zeit aktiv, auch wenn es keine Aktivität des Benutzers gibt. Wenn der Wertfalse
ist, muss sich der Benutzer nach vier Stunden Inaktivität erneut anmelden.Der Standardwert ist
false
.
Eine Beschreibung aller Sitzungsparameter finden Sie unter Parameter.
Beispiele¶
Konto in US West:
jdbc:snowflake://xy12345.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public
Konto in EU (Frankfurt):
jdbc:snowflake://xy12345.eu-central-1.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public
Verwenden von Single Sign-On (SSO) zur Authentifizierung¶
Wenn Sie Snowflake für die Verwendung von Single Sign-On (SSO) konfiguriert haben, können Sie Ihre Clientanwendung so konfigurieren, dass SSO für die Authentifizierung verwendet wird. Weitere Informationen dazu finden Sie unter Verwenden von SSO bei Clientanwendungen, die sich mit Snowflake verbinden.
Verwenden von Schlüsselpaar-Authentifizierung und Schlüsselrotation¶
Der Snowflake-JDBC-Treiber unterstützt Schlüsselpaar-Authentifizierung und Schlüsselrotation. Dieses Authentifizierungsverfahren erfordert ein 2048-Bit-RSA-Schlüsselpaar (Minimum).
Im ersten Schritt führen Sie die Erstkonfiguration der Schlüsselpaar-Authentifizierung durch, wie unter Schlüsselpaar-Authentifizierung und Schlüsselpaar-Rotation gezeigt.
Wählen Sie als Nächstes eine der folgenden drei Optionen, um entweder die JDBC-Verbindungseigenschaften oder die JDBC-Verbindungszeichenfolge zu konfigurieren.
Geben Sie den privaten Schlüssel über die Eigenschaft „privateKey“ in den Verbindungseigenschaften an.
Geben Sie Name und Kennwort der Datei des privaten Schlüssels als separate Eigenschaften in den Verbindungseigenschaften an.
Geben Sie Name und Kennwort der Datei mit dem privaten Schlüssel als Teil der Verbindungszeichenfolge an.
Diese Optionen werden in den nächsten drei Abschnitten ausführlicher beschrieben.
privateKey
-Eigenschaft in Verbindungseigenschaften¶
Dieser Abschnitt enthält ein Beispiel für das Festlegen der privateKey
-Eigenschaft für einen privaten Schlüssel in einer Datei.
In diesem Beispiel werden die Bouncy Castle Crypto-APIs verwendet. Um dieses Beispiel kompilieren und ausführen zu können, müssen Sie Ihrem Klassenpfad die folgenden JAR-Dateien hinzufügen:
die Anbieter-JAR-Datei (
bcprov-jdkVersionen.jar
)die PKIX/CMS/EAC/PKCS/OCSP/TSP/OPENSSL-JAR-Datei (
bcpkix-jdkVersionen.jar
)
wobei Versionen
die Versionen der JDK angibt, die von der JAR-Datei unterstützt werden.
So verwenden Sie dieses Beispiel:
Kopieren Sie den Beispielcode unten, und ersetzen Sie die folgenden Platzhalterwerte:
Platzhalter
Beschreibung
Pfad/rsa_key.p8
Geben Sie hier den Pfad und den Namen der privaten Schlüsseldatei an, die Sie zuvor generiert haben.
Passphrase_des_privaten_Schlüssels
Wenn Sie einen verschlüsselten Schlüssel generiert haben, implementieren Sie die
getPrivateKeyPassphrase()
-Methode, um die Passphrase zum Entschlüsseln dieses Schlüssels zurückzugeben.Konto
Geben Sie hier den Namen Ihres Kontos an (bereitgestellt von Snowflake).
Benutzer
Geben Sie hier Ihren Snowflake-Anmeldenamen an.
Datenbankname
Geben Sie hier den Namen der Datenbank an, die Sie verwenden möchten.
Schemaname
Geben Sie hier den Namen des Schemas an, das Sie verwenden möchten.
Warehousename
Geben Sie hier den Namen des Warehouses an, das Sie verwenden möchten.
Rolle
Geben Sie hier den Namen der Rolle an, die Sie verwenden möchten.
Kompilieren Sie den Beispielcode, und führen Sie ihn aus. Fügen Sie die Bouncy Castle-JAR-Dateien dem Klassenpfad hinzu.
Linux und macOS:
javac -cp bcprov-jdk<versions>.jar:bcpkix-jdk<versions>.jar TestJdbc.java java -cp .:snowflake-jdbc-<ver>.jar:bcprov-jdk<versions>.jar:bcpkix-jdk<versions>.jar TestJdbc.java
Windows:
javac -cp bcprov-jdk<versions>.jar;bcpkix-jdk<versions>.jar TestJdbc.java java -cp .;snowflake-jdbc-<ver>.jar;bcprov-jdk<versions>.jar;bcpkix-jdk<versions>.jar TestJdbc.java
Beispielcode
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8DecryptorProviderBuilder;
import org.bouncycastle.operator.InputDecryptorProvider;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo;
import org.bouncycastle.pkcs.PKCSException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Paths;
import java.security.PrivateKey;
import java.security.Security;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.util.Properties;
public class TestJdbc
{
// Path to the private key file that you generated earlier.
private static final String PRIVATE_KEY_FILE = "/<path>/rsa_key.p8";
public static class PrivateKeyReader
{
// If you generated an encrypted private key, implement this method to return
// the passphrase for decrypting your private key.
private static String getPrivateKeyPassphrase() {
return "<private_key_passphrase>";
}
public static PrivateKey get(String filename)
throws Exception
{
PrivateKeyInfo privateKeyInfo = null;
Security.addProvider(new BouncyCastleProvider());
// Read an object from the private key file.
PEMParser pemParser = new PEMParser(new FileReader(Paths.get(filename).toFile()));
Object pemObject = pemParser.readObject();
if (pemObject instanceof PKCS8EncryptedPrivateKeyInfo) {
// Handle the case where the private key is encrypted.
PKCS8EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = (PKCS8EncryptedPrivateKeyInfo) pemObject;
String passphrase = getPrivateKeyPassphrase();
InputDecryptorProvider pkcs8Prov = new JceOpenSSLPKCS8DecryptorProviderBuilder().build(passphrase.toCharArray());
privateKeyInfo = encryptedPrivateKeyInfo.decryptPrivateKeyInfo(pkcs8Prov);
} else if (pemObject instanceof PrivateKeyInfo) {
// Handle the case where the private key is unencrypted.
privateKeyInfo = (PrivateKeyInfo) pemObject;
}
pemParser.close();
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(BouncyCastleProvider.PROVIDER_NAME);
return converter.getPrivateKey(privateKeyInfo);
}
}
public static void main(String[] args)
throws Exception
{
String url = "jdbc:snowflake://<account>.snowflakecomputing.com";
Properties prop = new Properties();
prop.put("user", "<user>");
prop.put("privateKey", PrivateKeyReader.get(PRIVATE_KEY_FILE));
prop.put("db", "<database_name>");
prop.put("schema", "<schema_name>");
prop.put("warehouse", "<warehouse_name>");
prop.put("role", "<role_name>");
Connection conn = DriverManager.getConnection(url, prop);
Statement stat = conn.createStatement();
ResultSet res = stat.executeQuery("select 1");
res.next();
System.out.println(res.getString(1));
conn.close();
}
}
Dateiname und Kennwort des privaten Schlüssels als Verbindungseigenschaften¶
Sie können den Dateinamen und das Kennwort des privaten Schlüssels als separate Verbindungseigenschaften angeben. Beispiel:
Properties props = new Properties();
props.put("private_key_file", "/tmp/rsa_key.p8");
props.put("private_key_file_pwd", "dummyPassword");
Connection connection = DriverManager.getConnection(properties, "jdbc:snowflake://exampleaccount.snowflake.com");
Wenn Sie die Parameter private_key_file
und private_key_file_pwd
angeben, geben Sie den Parameter privateKey
nicht in den Verbindungseigenschaften an.
Dateiname und Kennwort des privaten Schlüssels in der Verbindungszeichenfolge¶
Sie können den Dateinamen und das Kennwort des privaten Schlüssels in der Verbindungszeichenfolge wie folgt angeben:
Connection connection = DriverManager.getConnection(properties,
"jdbc:snowflake://exampleaccount.snowflake.com/?private_key_file=/tmp/rsa_key.p8&private_key_file_pwd=dummyPassword");
Wenn Sie den privaten Schlüssel und das Kennwort in der Verbindungszeichenfolge angeben, geben Sie die Parameter private_key_file
, private_key_file_pwd
oder privateKey
nicht in den Verbindungseigenschaften an.
Überprüfen der Netzwerkverbindung zu Snowflake mit SnowCD¶
Nach der Konfiguration des Treibers können Sie die Netzwerkkonnektivität zu Snowflake mit SnowCD testen und Probleme beheben.
Sie können während der Erstkonfiguration und bei Bedarf jederzeit SnowCD verwenden, um Ihre Netzwerkverbindung zu Snowflake zu testen und Probleme zu beheben.
Verbinden über einen Proxyserver¶
Es gibt zwei Möglichkeiten, mit dem Snowflake JDBC-Treiber einen Proxyserver zu verwenden:
Fügen Sie den JVM (Java Virtual Machine)-Optionen Ihrer Clientanwendung Parameter hinzu.
Fügen Sie die Proxyhost- und Port-Informationen in die JDBC-Verbindungszeichenfolge oder die an die DriverManager .getConnection ()-Methode übergebenen Eigenschaften ein.
Beide Techniken sind im Folgenden dokumentiert.
Angeben eines Proxyservers durch Festlegen von JVM-Optionen¶
Um eine Verbindung über einen Proxyserver herzustellen, können Sie Optionen in Ihrem Code festlegen oder Befehlszeilenparameter an die JVM (Java Virtual Machine) Ihrer Clientanwendung übergeben. Die beiden Techniken sind äquivalent.
Gehen Sie folgendermaßen vor, um die Optionen in Ihrem Code festzulegen:
System.setProperty("http.useProxy", "true"); System.setProperty("http.proxyHost", "proxyHost Value"); System.setProperty("http.proxyPort", "proxyPort Valure"); System.setProperty("https.proxyHost", "proxyHost HTTPS Value"); System.setProperty("https.proxyPort", ""proxyPort HTTPS Value"")
Gehen Sie folgendermaßen vor, um die Optionen über Befehlszeilenparameter für Ihre JVM festzulegen:
-Dhttp.useProxy=true -Dhttps.proxyHost=<proxy_host> -Dhttp.proxyHost=<proxy_host> -Dhttps.proxyPort=<proxy_port> -Dhttp.proxyPort=<proxy_port>
Um den Proxy für eine oder mehrere IP-Adressen oder URLs zu umgehen, fügen Sie die Speicherorte zu Ihren JVM-Optionen hinzu: Die Elemente sind durch einen senkrechten Strich voneinander getrennt. Ein Element kann ein Sternchen („*“) als Platzhalterzeichen enthalten. Beispiel:
-Dhttp.nonProxyHosts="*.my_company.com|localhost|xy12345.snowflakecomputing.com|192.168.91.*"
Angeben eines Proxyservers in der JDBC-Verbindungszeichenfolge¶
Sie können die IP-Adresse und die Portnummer eines Proxyservers direkt in der JDBC-Verbindungszeichenfolge angeben:
jdbc:snowflake://<Konto>.<Regions-ID>.snowflakecomputing.com/?warehouse=<Warehousename> &useProxy=true&proxyHost=<IP-Adresse>&proxyPort=<Port>&proxyUser=test&proxyPassword=test
Beispiel:
jdbc:snowflake://xy12345.us-east-1.snowflakecomputing.com/?warehouse=DemoWarehouse1 &useProxy=true&proxyHost=172.31.89.76&proxyPort=8888&proxyUser=test&proxyPassword=test
Wenn Ihr Proxyserver keine Authentifizierung erfordert, können Sie die Informationen proxyUser und proxyPassword weglassen.
Bemerkung
Die obigen Beispiele enthalten Leerzeichen zur besseren Lesbarkeit. Wenn Sie eines dieser Beispiele kopieren und einfügen möchten, entfernen Sie das zusätzliche Leerzeichen.
Bemerkung
Das Angeben der Proxyinformationen als Teil der URL ist weniger sicher als andere Methoden zum Angeben der Proxyinformationen.
Tipp
Das Sicherheitsmodell von Snowflake erlaubt keine Secure Sockets Layer (SSL)-Proxys (unter Verwendung eines HTTPS-Zertifikats). Ihr Proxyserver muss eine öffentlich zugängliche Zertifizierungsstelle (CA) verwenden, um potenzielle Sicherheitsrisiken wie einen MITM (Man In The Middle)-Angriff durch einen kompromittierten Proxy zu reduzieren.
Wenn Sie Ihren SSL-Proxy verwenden müssen, empfehlen wir Ihnen dringend, die Serverrichtlinie zu aktualisieren, um die Snowflake-Zertifikatsprüfung zu bestehen, sodass mitten in der Kommunikation kein Zertifikat geändert wird.
Optional kann NO_PROXY
verwendet werden, um den Proxy für bestimmte Arten der Kommunikation zu umgehen. Beispielsweise kann der Zugriff auf Amazon S3 durch Angabe von NO_PROXY=".amazonaws.com"
umgangen werden.
OCSP¶
Wenn der Treiber eine Verbindung herstellt, sendet Snowflake ein Zertifikat, um zu bestätigen, dass die Verbindung zu Snowflake und nicht zu einem Host besteht, der sich als Snowflake ausgibt. Der Treiber sendet dieses Zertifikat an einen OCSP (Online Certificate Status Protocol)-Server, um zu überprüfen, ob das Zertifikat widerrufen wurde.
Wenn der Treiber den OCSP-Server nicht erreichen kann, um das Zertifikat zu überprüfen, kann beim Treiber „Fail-open“ oder „Fail-close“ auftreten.
Auswahl des Fail-Open- oder Fail-Close-Modus¶
Bei JDBC-Treiberversionen vor 3.8.0 findet standardmäßig „Fail-close“ statt. Bei Versionen 3.8.0 und höher findet standardmäßig „Fail-open“ statt. Sie können das Standardverhalten auf eine der folgenden Arten überschreiben:
Setzen Sie die Verbindungseigenschaft
ocspFailOpen
auftrue
oderfalse
. Beispiel: .Properties connection_properties = new Properties();
.connection_properties.put("ocspFailOpen", "false");
....
.connection = DriverManager.getConnection(connectionString, connection_properties);
Setzen Sie die Systemeigenschaft
net.snowflake.jdbc.ocspFailOpen
auftrue
oderfalse
. Beispiel: .Properties p = new Properties(System.getProperties());
.p.put("net.snowflake.jdbc.ocspFailOpen", "false");
.System.setProperties(p);
Überprüfen der Version von OCSP-Konnektor oder -Treiber¶
Weitere Informationen zu Treiber- oder Konnektor-Version, Konfiguration und OCSP-Verhalten finden Sie unter OCSP-Konfiguration.
OCSP-Antwort-Cacheserver¶
Bemerkung
Der OCSP-Antwort-Cacheserver wird derzeit vom Snowflake JDBC Driver 3.6.0 und höher unterstützt.
Snowflake-Clients initiieren jede Verbindung zu einem Snowflake-Service-Endpunkt mit einem „Handshake“, der eine sichere Verbindung herstellt, bevor tatsächlich Daten übertragen werden. Im Rahmen des Handshakes authentifiziert ein Client das TLS/SSL-Zertifikat für den Service-Endpunkt. Der Sperrstatus des Zertifikats wird überprüft, indem eine Client-Zertifikatsanforderung an einen der OCSP (Online Certificate Status Protocol)-Server für die CA (Zertifizierungsstelle) gesendet wird.
Ein Verbindungsfehler tritt auf, wenn die Antwort des OCSP-Servers über eine angemessene Zeit hinaus verzögert wird. Die folgenden Caches behalten den Sperrstatus bei und helfen, diese Probleme zu beheben:
Speichercache, der während der gesamten Lebensdauer des Prozesses beibehalten wird.
Dateicache, der so lange beibehalten wird, bis das Cacheverzeichnis (z. B.
~/.cache/snowflake
oder~/.snowsql/ocsp_response_cache
) gelöscht ist.Snowflake-OCSP-Antwort-Cacheserver, der OCSP-Antworten von den OCSP-Servern der CA stündlich abruft und 24 Stunden lang speichert. Clients können dann den Validierungsstatus eines bestimmten Snowflake-Zertifikats von diesem Servercache anfordern.
Wichtig
Wenn Ihre Serverrichtlinie den Zugriff auf die meisten oder alle externen IP-Adressen und Websites verweigert, müssen Sie die Adresse des Cacheservers auf die Whitelist setzen, um einen normalen Servicebetrieb zu ermöglichen. Der Hostname des Cacheservers lautet
ocsp*.snowflakecomputing.com:80
.Wenn Sie den Cacheserver aus irgendeinem Grund deaktivieren müssen, setzen Sie die Umgebungsvariable
SF_OCSP_RESPONSE_CACHE_SERVER_ENABLED
auffalse
. Beachten Sie, dass der Wert zwischen Groß- und Kleinschreibung unterscheidet und in Kleinbuchstaben angegeben werden muss.
Wenn keine der Cacheschichten die OCSP-Antwort enthält, versucht der Client, den Validierungsstatus direkt vom OCSP-Server der CA abzurufen.
Dateicaches¶
Um die Benutzerfreundlichkeit zu verbessern, verwendet der Treiber Dateicaches zur Authentifizierung und für OCSP-Antworten. Standardmäßig werden diese Dateien in den folgenden Verzeichnissen gespeichert:
- Linux
~/.cache/snowflake
- macOS
~/Library/Caches/Snowflake
- Windows
%USERPROFILE%AppDataLocalSnowflakeCaches
Wenn der JDBC-Anwendungsbenutzer im lokalen Betriebssystem kein Benutzerprofil hat, versucht der Treiber, die Cachedateien im temporären Verzeichnis zu speichern. Sie können den Treiber so konfigurieren, dass er Cachedateien in ein anderes Verzeichnis schreibt, indem Sie die folgenden Umgebungsvariablen verwenden:
SF_TEMPORARY_CREDENTIAL_CACHE_DIR=Zeichenfolge
Gibt den Speicherort der temporären Cachedatei mit den Anmeldeinformationen in einem lokalen Verzeichnis an. Dies kann auch beim Start mit der JVM-Option
-Dnet.snowflake.jdbc.temporaryCredentialCacheDir=Zeichenfolge
konfiguriert werden.SF_OCSP_RESPONSE_CACHE_DIR=Zeichenfolge
Gibt den Speicherort der OCSP-Antwort-Cachedatei in einem lokalen Verzeichnis an. Dies kann auch beim Start mit der JVM-Option
-Dnet.snowflake.jdbc.ocspResponseCacheDir=Zeichenfolge
konfiguriert werden.Weitere Informationen dazu finden Sie unter OCSP-Antwort-Cacheserver (unter diesem Thema).
Beachten Sie, dass die Optionen für JVM beim Start festgelegt werden sollten und nicht programmgesteuert (über System.setProperty()
). Wenn sowohl die Umgebungsvariable als auch die JVM-Optionen angegeben sind, wird die JVM-Option verwendet.
Konfigurieren der JDBC-Protokollierung¶
Ab Version 3.0.4 unterstützt der JDBC-Treiber zwei Protokollierungs-Frameworks:
Java-Core-Protokollierungsmöglichkeiten
Simple Logging Facade für Java
Java-Core-Protokollierungsmöglichkeiten (java.util.logging
)¶
Um diese Protokollierung zu verwenden, geben Sie für die JVM folgende Option an:
-Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.JDK14Logger
Anschließend können Sie die Protokollierungskonfiguration über die Anwendungsprogrammierungsschnittstelle (API) für die Protokollierung anpassen. Weitere Details dazu finden Sie in der Dokumentation zum java.util.logging-Paket.
Erstellen Sie beispielsweise eine Datei mit dem Namen logging.properties
und folgendem Inhalt:
########################################################### # Default Logging Configuration File # # You can use a different file by specifying a filename # with the java.util.logging.config.file system property. # For example java -Djava.util.logging.config.file=myfile ############################################################ ############################################################ # Global properties ############################################################ # "handlers" specifies a comma-separated list of log Handler # classes. These handlers will be installed during VM startup. # Note that these classes must be on the system classpath. # ConsoleHandler and FileHandler are configured here such that # the logs are dumped into both a standard error and a file. handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler # Default global logging level. # This specifies which kinds of events are logged across # all loggers. For any given facility this global level # can be overriden by a facility specific level. # Note that the ConsoleHandler also has a separate level # setting to limit messages printed to the console. .level = INFO ############################################################ # Handler specific properties. # Describes specific configuration information for Handlers. ############################################################ # default file output is in the tmp dir java.util.logging.FileHandler.pattern = /tmp/snowflake_jdbc%u.log java.util.logging.FileHandler.limit = 5000000000000000 java.util.logging.FileHandler.count = 10 java.util.logging.FileHandler.level = INFO java.util.logging.FileHandler.formatter = net.snowflake.client.log.SFFormatter # Limit the messages that are printed on the console to INFO and above. java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.formatter = net.snowflake.client.log.SFFormatter # Example to customize the SimpleFormatter output format # to print one-line log message like this: # <level>: <log message> [<date/time>] # # java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n ############################################################ # Facility specific properties. # Provides extra control for each logger. ############################################################ # Snowflake JDBC logging level. net.snowflake.level = INFO net.snowflake.handler = java.util.logging.FileHandler
Geben Sie die JVM-Parameter in die Befehlszeile ein:
java -jar application.jar -Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.JDK14Logger -Djava.util.logging.config.file=logging.properties
Dabei verweist application.jar
auf den Anwendungscode für den JDBC-Treiber. Die Protokolldateien befinden sich unter /tmp/snowflake_jdbc*
.
Simple Logging Facade für Java (org.slf4j
)¶
Wenn ein Implementierungspaket für die Protokollierung (z. B. org.sl4j:sl4j-jdk14
oder org.sl4j:slf4j-log4j12
) oder eine benutzerdefinierte Protokollierung (z. B. Ihre eigene org.slf4j.impl.StaticLoggerBinder
-Klasse) im Klassenpfad definiert wurde, dann verwendet der Treiber diese Protokollierung automatisch.
Sie können diese Protokollierung auch explizit verwenden, indem Sie die folgende JVM-Option angeben:
-Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.SLF4JLogger
.
Weitere Informationen dazu finden Sie in der Dokumentation zu Simple Logging Facade für Java (SLF4J).
Bemerkung
Wenn Sie keine Protokollierung für den Treiber mit einer der oben beschriebenen JVM-Optionen explizit angeben und keine benutzerdefinierte Protokollierung im Klassenpfad definiert ist (oder Sie eine Treiberversion vor 3.0.4 verwenden), verwendet der Treiber standardmäßig java.util.logging
. Es gilt jedoch das folgende Standardverhalten:
Sie können nicht angeben, wo die Protokolldatei geschrieben wird. Sie wird immer in das Verzeichnis geschrieben, das durch die Systemeigenschaft
java.io.tmpDir
angegeben ist:In Linux- und macOS-Umgebungen ist das Standardverzeichnis normalerweise entweder
/tmp
oder/var/tmp
.In Windows-Umgebungen ist das Standardverzeichnis normalerweise
C:\temp
.
Der Protokolliergrad wird durch den Verbindungsparameter
tracing
bestimmt (siehe oben).
Tipps zur Problembehandlung¶
Sicherstellen, dass die Eigenschaften korrekt eingestellt sind¶
Die DriverManager.getConnection()
-Methode liest nur die Werte des Eigenschaftsparameters, die mit bestimmten vordefinierten Namen übereinstimmen (z. B. „Kennwort“, „Konto“ usw.). Wenn Sie einen Eigenschaftsnamen falsch schreiben oder zusätzliche Eigenschaften hinzufügen, ignoriert der Treiber diese Eigenschaften, ohne eine Fehler- oder Warnmeldung auszugeben. Dies kann es erschweren, kleine Rechtschreibfehler zu erkennen.
Verwenden der richtigen Werte für Verbindungszeichenfolge und Konto¶
Eine häufige Ursache für Verbindungsprobleme besteht darin, zu viele oder zu wenig Informationen anzugeben, wenn Sie nach einem Konto, einem Kontonamen oder einer Verbindungszeichenfolge gefragt werden.
Die Kontoinformationen haben in der Regel die folgende Struktur, abhängig von der Region und der Cloudplattform, wo Ihr Konto gehostet wird:
Konto
Konto.Regions-ID
Konto.Regions-ID.Plattform
Beispiel:
xy12345
xy12345.us-east-1
xy12345.east-us-2.azure
Die JDBC-Verbindungszeichenfolge hat normalerweise folgende Struktur:
jdbc:snowflake://xy12345.east-us-2.azure.snowflakecomputing.com
Die Verwendung der Verbindungszeichenfolge, wenn Kontoinformationen erwartet werden (oder umgekehrt), kann zu schwer zu behebenden Problemen führen.
Falls Sie keine Verbindung herstellen können, wenn Sie nach einem Konto gefragt werden, versuchen Sie es sowohl mit der Minimalform (z. B. xy12345
) als auch mit dem vollständigen Kontonamen (z. B. xy12345.east-us-2.azure
, aber ohne .snowflakecomputing.com
), und stellen Sie sicher, dass Sie die Zeichenfolge jdbc:snowflake://
nicht enthalten ist.
Falls Sie keine Verbindung herstellen können, wenn Sie nach einer JDBC-Verbindungszeichenfolge gefragt werden, verwenden Sie die vollständige Form der Verbindungszeichenfolge (wie oben gezeigt).
Weitere Informationen zu Kontonamen finden Sie unter Verbindungsparameter.