Konfigurieren des JDBC-Treibers¶
Unter diesem Thema wird beschrieben, wie der JDBC-Treiber konfiguriert wird, einschließlich des Verbindens mit Snowflake mithilfe des Treibers.
Bemerkung
Die Verbindungsparameter sind jetzt unter Übersicht der Verbindungsparameter für den JDBC-Treiber dokumentiert.
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_identifier>.snowflakecomputing.com/?<connection_params>
Verbindungsparameter¶
Bemerkung
Die Dokumentation zu den einzelnen Verbindungsparametern finden Sie im Abschnitt Übersicht der Verbindungsparameter für den JDBC-Treiber.
<Kontobezeichner>
Gibt den Kontobezeichner für Ihr Snowflake-Konto an. Weitere Details dazu finden Sie unter Kontobezeichner. Beispiele für den in einer JDBC-Verbindungszeichenfolge verwendeten Kontobezeichner finden Sie unter Beispiele.
<Verbindungsparameter>
Gibt eine Folge von einem oder mehreren JDBC-Verbindungsparametern und Sitzungsparametern im Format
<Parameter>=<Wert>
an, wobei jeder Parameter durch das kaufmännische Und-Zeichen (&
) getrennt ist und keine Leerzeichen in der Verbindungszeichenfolge vorhanden sind.Wenn Sie Parameterwerte festlegen müssen, die Leerzeichen, kaufmännisches Und (
&
), Gleichheitszeichen (=
) oder andere Sonderzeichen verwenden, sollten Sie die Sonderzeichen URL-kodieren. Wenn Sie beispielsweise im Abfrage-Tag-Sitzungsparameter einen Wert angeben müssen, der ein Leerzeichen, ein kaufmännisches Und (&) und ein Gleichheitszeichen enthält, müssen Sie Folgendes tun:String connectionURL = "jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?query_tag='folder=folder1 folder2&'
Kodieren Sie das Leerzeichen als
%20
, das kaufmännische Und als%26
und das Gleichheitszeichen als%3D
:String connectionURL = "jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?query_tag='folder%3Dfolder1%20folder2%26'
Alternativ können Sie anstelle der Angabe dieser Parameter in der Verbindungszeichenfolge diese Parameter auch in einem
Properties
-Objekt festlegen, das Sie an dieDriverManager.getConnectionIO
-Methode übergeben.Properties props = new Properties(); props.put("parameter1", parameter1Value); props.put("parameter2", parameter2Value); Connection con = DriverManager.getConnection("jdbc:snowflake://<account_identifier>.snowflakecomputing.com/", props);
Bemerkung
Die Dokumentation zu den einzelnen Verbindungsparametern finden Sie im Abschnitt Übersicht der Verbindungsparameter für den JDBC-Treiber.
Weitere Parameter¶
Jeder Sitzungsparameter kann in die Verbindungszeichenfolge aufgenommen werden. Beispiel:
CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED=<Boolesch>
Gibt an, ob die Out-of-Band-Telemetrie aktiviert werden soll.
Der Standardwert ist
true
.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
.CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY=<Ganzzahl>
Gibt die Anzahl der Sekunden (900–3.600) zwischen den Versuchen des Clients an, das Token der Sitzung zu aktualisieren.
Der Standardwert ist
3600
.
Eine Beschreibung aller Sitzungsparameter finden Sie unter Parameter.
Beispiele¶
Es folgt ein Beispiel für die Verbindungszeichenfolge, die einen Kontobezeichner verwendet, der das Konto myaccount
der Organisation myorganization
angibt.
jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public
Im Folgenden finden Sie ein Beispiel für eine Verbindungszeichenfolge, die den Konto-Locator xy12345
als Kontobezeichner verwendet:
jdbc:snowflake://xy12345.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public
Beachten Sie, dass in diesem Beispiel ein Konto in der Region AWS US West (Oregon) verwendet wird. Wenn sich das Konto in einer anderen Region befindet oder wenn das Konto einen anderen Cloudanbieter verwendet, müssen Sie nach dem Konto-Locator zusätzliche Segmente angeben.
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 der mehrstufige Authentifizierung¶
Snowflake unterstützt das Caching von MFA-Token, einschließlich der Kombination der von MFA-Token-Caching mit SSO.
Weitere Informationen dazu finden Sie unter Verwenden von MFA-Tokencaching zur Minimierung der Anzahl von Eingabeaufforderungen bei der Authentifizierung – Optional.
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:
Anbieter-JAR-Datei (
bcprov-jdkversions.jar
)PKIX/CMS/EAC/PKCS/OCSP/TSP/OPENSSL JAR-Datei (
bcpkix-jdkversions.jar
)
wobei versions
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
path/rsa_key.p8
Geben Sie hier den Pfad und den Namen der privaten Schlüsseldatei an, die Sie zuvor generiert haben.
private_key_passphrase
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.account_identifier
Geben Sie hier Ihren Kontobezeichner an.
user
Geben Sie hier Ihren Snowflake-Anmeldenamen an.
database_name
Geben Sie hier den Namen der Datenbank an, die Sie verwenden möchten.
schema_name
Geben Sie hier den Namen des Schemas an, das Sie verwenden möchten.
warehouse_name
Geben Sie hier den Namen des Warehouses an, das Sie verwenden möchten.
role
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_identifier>.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();
}
}
Bemerkung
Verwenden Sie bei allen Betriebssystemen, einschließlich Windows, Schrägstriche als Trennzeichen in Dateipfaden. Der JDBC-Treiber ersetzt Schrägstriche durch das Pfad-Trennzeichen der jeweiligen Plattform.
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("jdbc:snowflake://myorganization-myaccount.snowflake.com", props);
Wenn Sie die Parameter private_key_file
und private_key_file_pwd
angeben, geben Sie den Parameter privateKey
nicht in den Verbindungseigenschaften an.
Bemerkung
Verwenden Sie bei allen Betriebssystemen, einschließlich Windows, Schrägstriche als Trennzeichen in Dateipfaden. Der JDBC-Treiber ersetzt Schrägstriche durch das Pfad-Trennzeichen der jeweiligen Plattform.
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(
"jdbc:snowflake://myorganization-myaccount.snowflake.com/?private_key_file=/tmp/rsa_key.p8&private_key_file_pwd=dummyPassword",
props);
Bemerkung
Verwenden Sie bei allen Betriebssystemen, einschließlich Windows, Schrägstriche als Trennzeichen in Dateipfaden. Der JDBC-Treiber ersetzt Schrägstriche durch das Pfad-Trennzeichen der jeweiligen Plattform.
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:
Legen Sie Systemeigenschaften für Ihre Proxyeinstellungen in der JVM (Java Virtual Machine) für Ihre Clientanwendung fest.
Fügen Sie die Proxyhost- und Portinformationen in die JDBC-Verbindungszeichenfolge oder das
Properties
-Objekt ein, das an dieDriverManager.getConnection()
-Methode übergebenen wird.
Beide Techniken sind im Folgenden dokumentiert.
Bemerkung
Proxyeinstellungen in der Verbindungszeichenfolge setzen die Proxysystemeigenschaften außer Kraft, die in der JVM festgelegt sind.
Tipp
Das Sicherheitsmodell von Snowflake lässt keine Transport Layer Security (TLS)-Proxys (mit einem HTTPS-Zertifikat) zu. 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 TLS-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.
Alternativ können Sie den Parameter nonProxyHosts
in der Verbindungszeichenfolge oder im Objekt Properties
festlegen, um den Proxy für bestimmte Kommunikationen zu umgehen. Beispielsweise kann der Zugriff auf Amazon S3 durch Angabe von nonProxyHosts=".amazonaws.com"
umgangen werden.
Angeben eines Proxyservers durch Festlegen von Java-Systemoptionen¶
Um eine Verbindung über einen Proxyserver herzustellen, können Sie die Proxysystemeigenschaften einstellen. Sie können diese entweder in Ihrem Code festlegen oder sie über die Befehlszeile an die JVM (Java Virtual Machine) für Ihre Clientanwendung übergeben.
Um die Systemeigenschaften in Ihrem Code einzustellen, rufen Sie System.setProperty
auf:
System.setProperty("http.useProxy", "true"); System.setProperty("http.proxyHost", "proxyHost Value"); System.setProperty("http.proxyPort", "proxyPort Value"); System.setProperty("https.proxyHost", "proxyHost HTTPS Value"); System.setProperty("https.proxyPort", ""proxyPort HTTPS Value"") System.setProperty("http.proxyProtocol", "https");
Um die Systemeigenschaften auf der Befehlszeile an Ihre JVM zu übergeben, verwenden Sie die Befehlszeilenoption -D
:
-Dhttp.useProxy=true -Dhttps.proxyHost=<proxy_host> -Dhttp.proxyHost=<proxy_host> -Dhttps.proxyPort=<proxy_port> -Dhttp.proxyPort=<proxy_port> -Dhttp.proxyProtocol="https"
Um den Proxy für eine oder mehrere IP-Adressen oder Hosts zu umgehen, setzen Sie die Systemeigenschaft http.nonProxyHosts
auf die Liste dieser Hosts:
Verwenden Sie ein Pipe-Symbol (
|
), um die Hostnamen zu trennen.Um Hostnamen anzugeben, die einem Muster entsprechen, verwenden Sie ein Sternchen (
*
) als Platzhalterzeichen.
Das folgende Beispiel zeigt, wie Sie diese Systemeigenschaft in der Befehlszeile einstellen:
-Dhttp.nonProxyHosts="*.my_company.com|localhost|myorganization-myaccount.snowflakecomputing.com|192.168.91.*"
Angeben eines Proxyservers in der JDBC-Verbindungszeichenfolge¶
Bemerkung
Das Angeben der Proxyinformationen als Teil der URL ist weniger sicher als andere Methoden zum Angeben der Proxyinformationen.
Um einen Proxyserver zu verwenden, setzen Sie die folgenden Parameter in der JDBC-Verbindungszeichenfolge:
Wenn Ihr Proxyserver keine Authentifizierung erfordert, können Sie die Parameter proxyUser
und proxyPassword
weglassen.
Wenn Ihre Proxyserververbindung eine Authentifizierung mit einem Proxybenutzernamen und einem Proxykennwort erfordert, können diese Anmeldeinformationen bei Verwendung des HTTP-Protokolls von anderen Anwendungen als Klartext offengelegt werden. Um zu vermeiden, dass diese Anmeldeinformationen preisgegeben werden, verwenden Sie den Parameter proxyProtocol
zur Angabe des HTTPS-Protokolls.
jdbc:snowflake://<account_identifier>.snowflakecomputing.com/?warehouse=<warehouse_name>&useProxy=true&proxyHost=<ip_address>&proxyPort=<port>&proxyUser=test&proxyPassword=test
Beispiel:
jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?warehouse=DemoWarehouse1&useProxy=true&proxyHost=172.31.89.76&proxyPort=8888&proxyUser=test&proxyPassword=test
Die Proxyeinstellungen, die Sie in der Verbindungszeichenfolge angeben, haben Vorrang vor den Proxysystemeigenschaften der JVM.
Umgehen des Proxyservers¶
Wenn Sie den Proxyserver bei der Verbindung mit einem oder mehreren Hosts umgehen müssen, geben Sie die Liste der Hosts im Parameter nonProxyHosts
an:
&nonProxyHosts=<bypass_proxy_for_these_hosts>
Verwenden Sie das URL-Escapezeichen %7C
(Pipe-Symbol), um den Hostnamen zu separieren. Sie können auch ein Sternchen (*
) als Platzhalter verwenden. Beispiel:
&nonProxyHosts=*.my_company.com%7Clocalhost%7Cmyorganization-myaccount.snowflakecomputing.com%7C192.168.91.*
Festlegen des Protokolls für die Verbindung mit dem Proxyserver¶
Mit dem Parameter proxyProtocol
können Sie das Protokoll angeben, das für die Verbindung mit dem Proxyserver verwendet wird. Der Standardwert ist http
. Gültige Werte sind http
und https
.
Beispiel:
&proxyProtocol=https
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/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-Dienstendpunkt mit einem „Handshake“, der eine sichere Verbindung herstellt, bevor tatsächlich Daten übertragen werden. Im Rahmen des Handshakes authentifiziert ein Client das TLS-Zertifikat für den Dienstendpunkt. 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 Zulassungsliste 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=string
Gibt den Speicherort der temporären Cachedatei mit den Anmeldeinformationen in einem lokalen Verzeichnis an. Dies kann auch mit der JVM-Option
-Dnet.snowflake.jdbc.temporaryCredentialCacheDir=string
beim Start konfiguriert werden.SF_OCSP_RESPONSE_CACHE_DIR=string
Gibt den Speicherort der OCSP-Antwort-Cachedatei in einem lokalen Verzeichnis an. Dies kann auch mit der JVM-Option
-Dnet.snowflake.jdbc.ocspResponseCacheDir=string
beim Start 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 (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 kundenspezifische 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).
Protokollierungskonfigurationsdatei¶
Alternativ können Sie den Protokolliergrad und das Verzeichnis, in dem die Protokolldateien gespeichert werden sollen, auch einfach in der Konfigurationsdatei sf_client_config.json
angeben.
Bemerkung
Dieses Feature der Protokollierungskonfigurationsdatei unterstützt nur die folgenden Protokolliergrade:
DEBUG
ERROR
INFO
OFF
TRACE
WARNING
Diese Konfigurationsdatei verwendet JSON, um die Protokollierungsparameter log_level
und log_path
wie folgt zu definieren:
{
"common": {
"log_level": "DEBUG",
"log_path": "/home/user/logs"
}
}
Der Treiber sucht in der folgenden Reihenfolge nach dem Speicherort der Konfigurationsdatei:
Verbindungsparameter
client_config_file
, der den vollständigen Pfad zur Konfigurationsdatei enthält.Umgebungsvariable
SF_CLIENT_CONFIG_FILE
, die den vollständigen Pfad zur Konfigurationsdatei enthält.JDBC-Treiberinstallationsverzeichnis, wo die Datei den Namen
sf_client_config.json
tragen muss.Basisverzeichnis des Benutzers, in dem die Datei
sf_client_config.json
heißen muss.
Bemerkung
Wenn die Konfigurationsdatei an keinem der oben genannten Speicherorte gefunden wird, verwendet der Treiber die Java-Core-Protokollierungsmöglichkeiten.
Wenn eine Konfigurationsdatei, die entweder im Verbindungsparameter
client_config_file
oder in der UmgebungsvariablenSF_CLIENT_CONFIG_FILE
angegeben ist, nicht gefunden oder gelesen werden kann, gibt der Treiber eine Fehlermeldung aus.
Deaktivieren der Befehle PUT und GET¶
Standardmäßig können Sie mit dem Treiber JDBC die Befehle PUT und GET ausführen. Wenn Sie den Befehlen PUT und GET keinen Zugriff auf das lokale Dateisystem gewähren möchten, können Sie die Befehle auf folgende Weise deaktivieren:
Setzen Sie den Serverparameter JDBC_ENABLE_PUT_GET auf
FALSE
.Setzen Sie den JDBC-Verbindungsparameter enablePutGet auf
false
.Rufen Sie die Methode
SFBaseSession.setEnablePutGet(false)
auf.
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“, „Warehouse“ 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 korrekten Werte für Verbindungszeichenfolge und Konto¶
Wenn Sie keine Verbindung herstellen können, überprüfen Sie, ob Sie den Kontobezeichner in der JDBC-Verbindungszeichenfolge korrekt angegeben haben. Weitere Informationen zu Kontobezeichnern finden Sie unter Kontobezeichner.