JDBC ドライバーの構成¶
このトピックでは、ドライバーを使用してSnowflakeに接続する方法など、 JDBC ドライバーを構成する方法について説明します。
注釈
接続パラメーターは、 JDBC ドライバーの接続パラメーター参照 に記載されています。
このトピックの内容:
JDBC ドライバークラス¶
JDBC アプリケーションでドライバークラスとして net.snowflake.client.jdbc.SnowflakeDriver を使用します。
注釈
- アプリケーションコード内で他のSnowflakeクラスまたはメソッドを参照しないでください。将来、改善および修正を実装するために変更される可能性があります。 
- 以前のドライバークラス - com.snowflake.client.jdbc.SnowflakeDriverは引き続きサポートされますが、非推奨です(つまり、将来の TBDリリースで削除されます)。そのため、以前のクラス名を参照するコードは引き続き機能しますが、変更が実装されているため、新しいクラス名を参照するように、コードを更新する必要があります。
JDBC ドライバー接続文字列¶
重要
Snowflakeバージョン8.24から、ネットワーク管理者は、Snowflakeへのすべての接続に多要素認証 (MFA) を要求するオプションがあります。管理者がこの機能を有効にすることを決定した場合、Snowflakeへの接続時に MFA を使用するようにクライアントまたはドライバを設定する必要があります。詳細については、次をご参照ください:
JDBC ドライバーを使用して Snowflake に接続するには、以下の構文の接続文字列が必要です。
Snowsight で基本接続文字列を生成できます。詳細については、 Snowflakeに接続するためのクライアント、ドライバー、ライブラリ、またはサードパーティアプリケーションの構成 をご参照ください。
注釈
JDBC クライアント接続文字列内に SEARCH_PATH パラメーターを設定することはできません。検索パスを設定する前にセッションを確立する必要があります。
構文¶
jdbc:snowflake://<account_identifier>.snowflakecomputing.com/?<connection_params>
接続パラメーター¶
注釈
個々の接続パラメーターのドキュメントについては、 JDBC ドライバーの接続パラメーター参照 をご参照ください。
- <account_identifier>
- Snowflakeアカウントのアカウント識別子を指定します。詳細については、 Snowflakeに接続するためのクライアント、ドライバー、ライブラリ、またはサードパーティアプリケーションの構成 をご参照ください。JDBC 接続文字列で使用されるアカウント識別子の例については、 例 をご参照ください。 
- <connection_params>
- 一連の1つ以上の JDBC 接続パラメーター と セッションパラメーター は、 - <パラメーター >=<param>の形式で指定します。各パラメーターはアンパサンド文字(- &)で区切られ、接続文字列のいずれにもスペースは使用しません。- スペース、アンパサンド( - &)、等号(- =)、またはその他の特殊文字を使用するパラメーター値を設定する必要がある場合は、 特殊文字を URL エンコード する必要があります。たとえば、 クエリタグ セッションパラメーターにスペース、アンパサンド、等号を含む値を指定する必要がある場合は、次のようになります。- String connectionURL = "jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?query_tag='folder=folder1 folder2&' - スペースを - %20、アンパサンドを- %26、等号を- %3Dとしてエンコードします。- String connectionURL = "jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?query_tag='folder%3Dfolder1%20folder2%26' - 別の方法として、接続文字列でこれらのパラメーターを指定する代わりに、 - DriverManager.getConnectionIOメソッドに渡す- Propertiesオブジェクトでこれらのパラメーターを設定できます。- Properties props = new Properties(); props.put("parameter1", parameter1Value); props.put("parameter2", parameter2Value); Connection con = DriverManager.getConnection("jdbc:snowflake://<account_identifier>.snowflakecomputing.com/", props); 
注釈
個々の接続パラメーターのドキュメントについては、 JDBC ドライバーの接続パラメーター参照 をご参照ください。
その他のパラメーター¶
任意のセッションパラメーターを接続文字列に含めることができます。例:
BROWSER_RESPONSE_TIMEOUT=<Integer>
外部ブラウザからの認証に成功するまでのタイムアウトを秒単位で指定します。
デフォルトは
120です。
CLIENT_OUT_OF_BAND_TELEMETRY_ENABLED=<Boolean>
アウトオブバンドテレメトリを有効にするかどうかを指定します。
デフォルトは
trueです。
CLIENT_SESSION_KEEP_ALIVE=<Boolean>
非アクティブな状態が一定時間続いた後、現在のセッションをアクティブのままにするか、ユーザーに再度ログインさせるかを指定します。値が
trueの場合、Snowflakeは、ユーザーからのアクティビティがない場合でも、セッションを無期限にアクティブに保ちます。値がfalseの場合、ユーザーは4時間の非アクティブ後に再度ログインする必要があります。デフォルトは
falseです。
CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY=<Integer>
クライアントがセッションのトークンの更新を試みる間隔の秒数(900から3600)を指定します。
デフォルトは
3600です。
net.snowflake.jdbc.commons_logging_wrapper
コモンズ・ログからのログの処理方法を指定します。可能な値は次のとおりです。
ALL: 共通ロギングからのログはすべてSFLoggerに渡されます(java.util.loggingまたは SLF4J は内部的に使用されます)。
Default: コモンズログからのログはすべてjava.util.loggingに転送され、 SLF4J ロガーにはログは転送されません。
OFF: コモンズログからのログは転送されません。シン JAR ファイルを使用する際に、コモンズのログを SLF4J ブリッジに置き換える必要がある場合、この値を使用できます。
すべてのセッションパラメーターの説明については、 パラメーター をご参照ください。
例¶
以下は、組織 myorganization 内のアカウント myaccount の 識別子としてアカウント名 を使用する接続文字列の例です。
jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public
以下は、アカウント識別子として アカウントロケーター xy12345 を使用する、接続文字列の例です。
jdbc:snowflake://xy12345.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public
この例では、 AWS US 西部(オレゴン)リージョンのアカウントを使用しています。アカウントが別のリージョンにある場合、またはアカウントが別のクラウドプロバイダーを使用している場合は、 アカウントロケーターの後に追加のセグメントを指定する 必要があります。
connections.toml ファイルを使用した接続¶
JDBC により、 connections.toml 構成ファイルに接続定義を追加できます。接続定義とは、接続に関連するパラメーターのコレクションのことです。ドライバは現在、 TOML バージョン1.0.0 をサポートしています。
toml ファイルフォーマットの詳細については、 TOML (Tom's Obvious Minimal Language) をご参照ください。
接続文字列のプレフィックス: jdbc:snowflake:auto は、定義済みの(デフォルトの)ファイルから接続設定を探すようドライバーに指示します。JDBC ドライバーは、 connections.toml ファイルを以下の場所で順に探します。
- マシンに - ~/.snowflakeディレクトリが存在する場合、 Snowflake CLI は- ~/.snowflake/connections.tomlファイルを使用します。
- SNOWFLAKE_HOME環境変数で指定された場所。
- そうでない場合、 Snowflake CLI はオペレーティングシステムに応じて、次のいずれかの場所にある - connections.tomlファイルを使用します。- Linux: - ~/.config/snowflake/connections.toml、ただし、 XDG 変数で更新可
- Windows: - %USERPROFILE%\AppData\Local\snowflake\connections.toml
- Mac: - ~/Library/Application Support/snowflake/connections.toml
 
TOML の構成ファイルの基本設定は、 Snowsight で生成できます。詳細については、 Snowflakeに接続するためのクライアント、ドライバー、ライブラリ、またはサードパーティアプリケーションの構成 をご参照ください。
既存の複数の接続を切り替える場合は、 connections.toml ファイルで設定できます。デフォルトのキーは default ですが、 SNOWFLAKE_DEFAULT_CONNECTION_NAME シェル環境変数を設定することで、デフォルトの接続名を変更できます。
以下のサンプル・ファイル(connections.toml)では、2つの接続を定義しています。
[default]
account = 'my_organization-my_account'
user = 'test_user'
password = '******'
warehouse = 'testw'
database = 'test_db'
schema = 'test_nodejs'
protocol = 'https'
port = '443'
[aws-oauth-file]
account = 'my_organization-my_account'
user = 'test_user'
password = '******'
warehouse = 'testw'
database = 'test_db'
schema = 'test_nodejs'
protocol = 'https'
port = '443'
authenticator = 'oauth'
token_file_path = '/Users/test/.snowflake/token'
認証でのシングルサインオン(SSO)の使用¶
シングルサインオン(SSO)を使用するようにSnowflakeを構成 している場合、認証に SSO を使用するようにクライアントアプリケーションを構成できます。詳細については Snowflakeに接続するクライアントアプリケーションでの SSO の使用 をご参照ください。
多要素認証の使用¶
Snowflakeは、 MFA トークンキャッシングと SSO の組み合わせを含む、 MFA トークンのキャッシングをサポートしています。
詳細については、 MFA トークンキャッシングを使用して認証中のプロンプトの数を最小限に抑える --- オプション をご参照ください。
キーペア認証とキーローテーションの使用¶
Snowflake JDBC ドライバーは、キーペア認証とキーローテーションをサポートしています。この認証方法には、2048ビット(最小)の RSA キーペアが必要です。
開始するには、 キーペア認証とキーペアローテーション に示すように、キーペア認証の初期構成を完了します。
そして、次に挙げる3つのオプションのいずれかを選択して、 JDBC 接続プロパティまたは JDBC 接続文字列を構成します。
- 接続プロパティのprivateKeyプロパティを介して秘密キーを指定します。 
- 接続プロパティで個別のプロパティとして、そのファイルの秘密キーファイル名とパスワードを指定します。 
- 接続文字列の一部として、そのファイルの秘密キーファイル名とパスワードを指定します。 
これらのオプションについては、次の3つのセクションで詳しく説明します。
接続プロパティの privateKey プロパティ¶
このセクションでは、 privateKey プロパティをファイルの秘密キーに設定する例を示します。
この例では、 Bouncy Castle暗号化 APIs を使用しています。この例をコンパイルして実行するには、クラスパスに次の JAR ファイルを含める必要があります。
- プロバイダー JAR ファイル( - bcprov-jdkversions.jar)
- PKIX / CMS / EAC / PKCS / OCSP / TSP / OPENSSL JAR ファイル( - bcpkix-jdkversions.jar)
ここで、 versions は、 JAR ファイルがサポートする JDK のバージョンを指定します。
この例を使用するには、
- 以下のサンプルコード をコピーし、次のプレースホルダー値を置き換えます。 - プレースホルダー - 説明 - path/rsa_key.p8- これを前に生成した秘密キーファイルのパスと名前に設定します。 - private_key_passphrase- 暗号化されたキーを生成した場合は、 - getPrivateKeyPassphrase()メソッドを実装して、そのキーを復号化するためのパスフレーズを返します。- account_identifier- これは、使用する アカウント識別子 に設定します。 - user- これをSnowflakeのログイン名に設定します。 - database_name- これを、使用するデータベースの名前に設定します。 - schema_name- これを、使用するスキーマの名前に設定します。 - warehouse_name- これを、使用するウェアハウスの名前に設定します。 - role- これを、使用するロールの名前に設定します。 
- サンプルコードをコンパイルして実行します。クラスパスにBouncy Castle JAR ファイルを含めます。 - たとえば、Linuxおよび 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 
サンプルコード
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();
  }
}
注釈
Windowsを含むすべてのオペレーティングシステムで、ファイルパスの区切り文字としてスラッシュを使用します。JDBC ドライバーは、スラッシュをプラットフォームの適切なパス区切り文字に置き換えます。
接続プロパティとしての秘密キーファイル名とパスワード¶
秘密キーファイル名とパスワードを個別の接続プロパティとして指定できます。次に例を示します。
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);
private_key_file および private_key_file_pwd パラメーターを指定する場合は、接続プロパティで privateKey パラメーターを指定しないでください。
注釈
Windowsを含むすべてのオペレーティングシステムで、ファイルパスの区切り文字としてスラッシュを使用します。JDBC ドライバーは、スラッシュをプラットフォームの適切なパス区切り文字に置き換えます。
接続文字列の秘密キーファイル名とパスワード¶
以下に示すように、接続文字列で秘密キーファイル名とパスワードを指定できます。
Connection connection = DriverManager.getConnection(
    "jdbc:snowflake://myorganization-myaccount.snowflake.com/?private_key_file=/tmp/rsa_key.p8&private_key_file_pwd=dummyPassword",
    props);
注釈
Windowsを含むすべてのオペレーティングシステムで、ファイルパスの区切り文字としてスラッシュを使用します。JDBC ドライバーは、スラッシュをプラットフォームの適切なパス区切り文字に置き換えます。
接続文字列で秘密キーとパスワードを指定する場合は、接続プロパティでパラメーター private_key_file、 private_key_file_pwd、または privateKey を指定しないでください。
キー復号エラー¶
OpenSSL V3 を使用して生成された暗号化キーを使用する場合、以下のようなエラーが発生することがあります。
java.security.NoSuchAlgorithmException: 1.2.840.113549.1.5.13 SecretKeyFactory not available
java.security.InvalidKeyException: IOException : DER input, Integer tag error
このような場合、次の JVM 引数を指定することで、Bouncy Castle を使ってキーを復号化することができます。
-Dnet.snowflake.jdbc.enableBouncyCastle=true
OAuth 2.0 クライアント認証フローの使用¶
OAuth 2.0クライアント認証情報フローは、Python用Snowflake Connectorがバックエンドサービスに接続するような、マシン間(M2M)認証のためのセキュアな方法を提供します。OAuth 2.0認証コードフローとは異なり、このメソッドはユーザー固有のデータに依存しません。
OAuth 2.0 クライアント認証フローを有効にするには:
- codenowrap: - authenticator接続パラメーターを- oauth_client_credentialsに設定します。
- 以下の OAuth 接続パラメーターをセットします。 - oauthClientId:Snowflake統合(Snowflake セキュリティ統合メタデータ)用にプロバイダーから提供された- client idの値。
- oauthClientSecret: IDプロバイダーがSnowflake統合用に提供する- client secretの値(Snowflakeセキュリティ統合メタデータ)
- oauthTokenRequestUrl: ドライバーにアクセストークンを供給するIDプロバイダーエンドポイント。
- oauthScope: IDプロバイダーの認可リクエストでリクエストされたスコープ。デフォルトでは、ロールから派生します。複数のスコープが必要な場合、値はスペースで区切られた複数のスコープのリストでなければなりません。
 
プログラムアクセストークンによる認証コード (PAT)¶
プログラムアクセストークン(PAT)は、Snowflake固有の認証方法です。この機能は使用前にアカウントで有効にする必要があります(詳細は 前提条件 を参照してください)。PAT での認証コードには、人とのやりとりは一切ありません。
ワークロードIDフェデレーション(WIF)¶
ワークロードIDフェデレーション は、Snowflakeのサービス間の認証方法を提供します。この方法により、アプリケーション、サービス、コンテナーは、のようなクラウドプロバイダーのネイティブIDシステムを活用して、Snowflakeで認証することができます。 AWSIAMMicrosoft Entra IDまたはGoogle Cloudサービスアカウント。このアプローチでは、長期間有効な認証情報を管理する必要がなくなり、外部 OAuth のような他の方法と比較して、認証情報の取得が簡素化されます。Snowflakeコネクタは、プラットフォームのIDプロバイダーから有効期間が短い認証情報を自動的に取得するように設計されています。
ワークロードIDフェデレーション認証コードを有効にするには、以下を実行します。
SnowCD を使用したSnowflakeへのネットワーク接続の確認¶
ドライバーを設定したら、 SnowCD を使用して、Snowflakeへのネットワーク接続を評価およびトラブルシューティングできます。
初期設定プロセス中にオンデマンドで SnowCD をいつでも使用して、Snowflakeへのネットワーク接続を評価およびトラブルシューティングできます。
プロキシサーバーを使用した接続¶
Snowflake JDBC ドライバーでは、以下の方法でプロキシサーバーを使用できます。
- プロキシホストとポート情報を JDBC 接続文字列 または - DriverManager.getConnection()メソッドに渡される- Propertiesオブジェクトに含めます。
注釈
接続文字列で指定されたプロキシ設定は、 JVM システム・プロパティよりも優先されます。
Tip
Snowflakeのセキュリティモデルは、トランスポート層セキュリティ(TLS)プロキシ(HTTPS 証明書を使用)を許可しません。プロキシサーバーは、公的に利用可能な認証機関(CA)を使用する必要があり、侵害されたプロキシを介した MITM (Man In The Middle)攻撃などの潜在的なセキュリティリスクを低減します。
TLS プロキシを使用する 必要がある 場合は、通信中に証明書が変更されないように、サーバーポリシーを更新してSnowflake証明書を渡すことを強くお勧めします。
別の方法として、接続文字列または Properties オブジェクトに nonProxyHosts パラメーターを設定して、特定の通信のプロキシをバイパスすることもできます。たとえば、 nonProxyHosts=".amazonaws.com" を指定すると、Amazon S3アクセスをバイパスできます。
Javaシステムプロパティの設定によるプロキシサーバーの指定¶
プロキシサーバーを介して接続するために、プロキシシステムのプロパティを設定できます。これらをコードで設定するか、コマンドラインでクライアントアプリケーションの JVM (Java仮想マシン)に渡すことができます。
詳細については、 Javaネットワークとプロキシ をご参照ください。
コードにシステムプロパティを設定するには、 System.setProperty を呼び出します。
System.setProperty("http.useProxy", "true"); System.setProperty("http.proxyHost", "proxyHost Value"); System.setProperty("http.proxyPort", "proxyPort Value"); System.setProperty("http.proxyUser", "proxyUser Value"); System.setProperty("http.proxyPassword", "proxyPassword Value"); System.setProperty("https.proxyHost", "proxyHost HTTPS Value"); System.setProperty("https.proxyPort", "proxyPort HTTPS Value"); System.setProperty("https.proxyUser", "proxyUser HTTPS Value"); System.setProperty("https.proxyPassword", "proxyPassword HTTPS Value"); System.setProperty("http.proxyProtocol", "https");
コマンドラインのシステムプロパティを JVM に渡すには、 -D コマンドラインオプションを使用します。
-Dhttp.useProxy=true -Dhttps.proxyHost=<proxy_host> -Dhttps.proxyPort=<proxy_port> -Dhttps.proxyUser=<proxy_user> -Dhttps.proxyPassword=<proxy_password> -Dhttp.proxyHost=<proxy_host> -Dhttp.proxyPort=<proxy_port> -Dhttp.proxyUser=<proxy_user> -Dhttp.proxyPassword=<proxy_password> -Dhttp.proxyProtocol="https"
1つ以上の IP アドレスまたはホストのプロキシをバイパスするには、 http.nonProxyHosts システムプロパティをこれらのホストのリストに設定します。
- パイプ記号( - |)を使用してホスト名を区切ります。
- パターンに一致するホスト名を指定するには、ワイルドカード文字としてアスタリスク( - *)を使用します。
次の例は、コマンドラインでこのシステムプロパティを設定する方法を示しています。
-Dhttp.nonProxyHosts="*.example.com|localhost|myorganization-myaccount.snowflakecomputing.com|192.168.91.*"
JDBC 接続文字列によるプロキシサーバーの指定¶
注釈
URL の一部としてプロキシ情報を指定すると、プロキシ情報を指定する他の方法よりも安全性が低くなります。
JDBC 接続文字列に次のパラメーターを設定してプロキシサーバーを使用するには、
プロキシサーバーが認証を必要としない場合は、 proxyUser および proxyPassword パラメーターを省略できます。
プロキシサーバー接続でプロキシユーザー名とプロキシパスワードを使用した認証が必要な場合に HTTP プロトコルを使用すると、これらの認証情報が他のアプリケーションによってプレーンテキストとして公開される可能性があります。これらの認証情報の公開を回避するには、 proxyProtocol パラメーターを使用して HTTPS プロトコルを指定します。
jdbc:snowflake://<account_identifier>.snowflakecomputing.com/?warehouse=<warehouse_name>&useProxy=true&proxyHost=<ip_address>&proxyPort=<port>&proxyUser=test&proxyPassword=test
例:
jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?warehouse=DemoWarehouse1&useProxy=true&proxyHost=172.31.89.76&proxyPort=8888&proxyUser=test&proxyPassword=test
接続文字列で指定されたプロキシ設定は、 JVM システム・プロパティよりも優先されます。
プロキシ JVM の引数が設定されていて、どの接続にもプロキシを設定しない場合は、 useProxy=false を設定しないでください。代わりに、 JVM のプロキシ設定を効果的にバイパスする、以下を使用します。
useProxy=true
proxyHost=127.0.0.1
proxyPort=8080
nonProxyHosts=*
プロキシサーバーのバイパス¶
1つ以上のホストに接続するときにプロキシサーバーをバイパスする必要がある場合は、 nonProxyHosts パラメーターでホストのリストを指定します。
&nonProxyHosts=<bypass_proxy_for_these_hosts>
ホスト名は URL をエスケープしたパイプ記号(%7C)で区切ります。アスタリスク(*)をワイルドカードとして使用することもできます。例:
&nonProxyHosts=*.example.com%7Clocalhost%7Cmyorganization-myaccount.snowflakecomputing.com%7C192.168.91.*
プロキシサーバーへの接続に使用するプロトコルの指定¶
- プロキシサーバーへの接続に使用するプロトコルを指定するには、 - proxyProtocolパラメーターを使用します。デフォルト値は- httpですが、- httpsも有効です。
例:
&proxyProtocol=https
OCSP¶
ドライバーが接続すると、Snowflakeは証明書を送信して、Snowflakeを偽装しているホストではなく、Snowflakeへの接続であることを確認します。ドライバーはその証明書を OCSP (オンライン証明書状態プロトコル)サーバーに送信し、証明書が失効していないことを確認します。
ドライバーが証明書を確認するために OCSP サーバーに到達できない場合、ドライバーは "fail open" or "fail closed" できます。
フェールオープンまたはフェールクローズモードの選択¶
JDBC 3.8.0より前のドライバーバージョンは、デフォルトでフェールクローズになります。バージョン3.8.0以降はデフォルトでフェールオープンになります。次のいずれかの方法でデフォルトの動作を上書きできます。
- 接続プロパティ - ocspFailOpenを- trueまたは- falseに設定します。 例:- Properties connection_properties = new Properties(); connection_properties.put("ocspFailOpen", "false"); ... connection = DriverManager.getConnection(connectionString, connection_properties); 
- システムプロパティ - net.snowflake.jdbc.ocspFailOpenを- trueまたは- falseに設定します。例:- Properties p = new Properties(System.getProperties()); p.put("net.snowflake.jdbc.ocspFailOpen", "false"); System.setProperties(p); 
OCSP コネクタまたはドライバーバージョンの確認¶
ドライバーまたはコネクタのバージョン、構成、および OCSP の動作の詳細については、 OCSP 設定 をご参照ください。
OCSP 応答キャッシュサーバー¶
注釈
OCSP 応答キャッシュサーバーは現在、Snowflake JDBC ドライバー3.6.0以降でサポートされています。
Snowflakeクライアントは、実際にデータを転送する前に安全な接続を確立する「ハンドシェイク」を使用して、Snowflakeサービスエンドポイントへのすべての接続を開始します。ハンドシェイクの一部として、クライアントはサービスエンドポイントの TLS 証明書を認証します。証明書の失効ステータスは、 CA (認証機関)の OCSP (オンライン証明書ステータスプロトコル)サーバーの1つにクライアント証明書リクエストを送信することにより確認されます。
OCSP サーバーからの応答が妥当な時間を超えて遅延すると、接続エラーが発生します。次のキャッシュは失効ステータスを保持し、これらの問題の軽減に役立ちます。
- プロセスの存続期間中保持されるメモリキャッシュ。 
- ファイルキャッシュ。キャッシュディレクトリ(例: - ~/.cache/snowflakeまたは- ~/.snowsql/ocsp_response_cache)が削除されるまで保持します。
- Snowflake OCSP 応答キャッシュサーバー。CA の OCSP サーバーから OCSP 応答を1時間ごとに取得し、24時間保存します。クライアントは、このサーバーキャッシュから特定のSnowflake証明書の検証ステータスをリクエストできます。 - 重要 - サーバーポリシーでほとんどまたはすべての外部 IP アドレスおよびウェブサイトへのアクセスが拒否された場合、通常のサービス操作を許可するには、キャッシュサーバーアドレスを許可リストに登録することが 必須 です。キャッシュサーバーのホスト名は - ocsp*.snowflakecomputing.com:80です。- 何らかの理由でキャッシュサーバーを無効化する必要がある場合は、 - SF_OCSP_RESPONSE_CACHE_SERVER_ENABLED環境変数を- falseに設定します。値は大文字と小文字が区別され、小文字にする 必要がある ことに注意してください。
キャッシュレイヤーに OCSP 応答が含まれていない場合、クライアントは CAの OCSP サーバーから検証ステータスを直接取得しようとします。
ファイルキャッシュ¶
使いやすさを向上させるために、ドライバーは認証と OCSP 応答にファイルキャッシュを使用します。デフォルトでは、これらのファイルは次のディレクトリに保存されます。
- Linux:
- ~/.cache/snowflake
- macOS:
- ~/Library/Caches/Snowflake
- Windows:
- %USERPROFILE%AppDataLocalSnowflakeCaches
JDBC アプリケーションユーザーのローカルオペレーティングシステムにユーザープロファイルがない場合、ドライバーはキャッシュファイルを一時ディレクトリに保存しようとします。次の環境変数を使用して、キャッシュファイルを別のディレクトリに書き込むようにドライバーを構成できます。
SF_TEMPORARY_CREDENTIAL_CACHE_DIR=string
ローカルディレクトリ内の一時的な認証情報キャッシュファイルの場所を指定します。これは、起動時に JVM オプション
-Dnet.snowflake.jdbc.temporaryCredentialCacheDir=stringで構成することもできます。
SF_OCSP_RESPONSE_CACHE_DIR=string
ローカルディレクトリ内の OCSP 応答キャッシュファイルの場所を指定します。これは、起動時に JVM オプション
-Dnet.snowflake.jdbc.ocspResponseCacheDir=stringで構成することもできます。詳細については、このトピックの OCSP 応答キャッシュサーバー をご参照ください。
JVM オプションは、プログラムではなく( System.setProperty() を介して)起動時に設定する必要があります。環境変数と JVM オプションの両方が提供されている場合、 JVM オプションが使用されます。
JDBC ログの構成¶
バージョン 3.0.4 以降、 JDBC ドライバーは以下のログフレームワークをサポートしています。
- Java Core Logging Facilities (ドライバーのデフォルト・ログ) 
Javaコアログ機能(Java.util.logging)¶
デフォルトでは、 java.util.logging は、 ConsoleHandler を使って標準エラーストリームに書き込みます。ブール JAVA_LOGGING_CONSOLE_STD_OUT javaまたは接続プロパティを true に設定すると、すべてのログを標準出力ストリームに書き込みます。デフォルト値は false です。
JAVA_LOGGING_CONSOLE_STD_OUT を有効にすると、 :codenowrap:`JAVA_LOGGING_CONSOLE_STD_OUT_THRESHOLD`Javaまたは接続プロパティを設定して、ドライバーが標準出力に書き込む最大ログレベルを設定することもできます。指定された以上のレベルのログメッセージは標準エラーに送られます。このプロパティに指定できる値には、以下のものがあります。
- OFF
- SEVERE
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
- ALL
このロガーを明示的に選択するには、 JVM に以下のオプションを指定します。
-Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.JDK14Logger
次に、ロガーのアプリケーションプログラミングインターフェイス(API)を使用して、ログ記録の構成をカスタマイズできます。
詳細については、 java.util.loggingパッケージのドキュメント をご参照ください。
たとえば、次の内容を含む logging.properties という名前のファイルを作成します。
########################################################### # 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
コマンドラインで JVM パラメーターを指定します。
java -jar application.jar -Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.JDK14Logger -Djava.util.logging.config.file=logging.properties
application.jar は JDBC ドライバーのアプリケーションコードを参照します。ログファイルは /tmp/snowflake_jdbc* にあります。
Simple Logging Facade for Java(org.slf4j)¶
このロガーを選択するには、 JVM オプションをセットします。
-Dnet.snowflake.jdbc.loggerImpl=net.snowflake.client.log.SLF4JLogger
slf4j-apiとその実装(例えば、logback)をclasspathに追加する必要があります。
詳細については、 Simple Logging Facade for Java(SLF4J)のドキュメント をご参照ください。
commons-loggingからのブリッジログ¶
一部のライブラリはApache commons-loggingをログに使用しています。これらのログの処理は、バージョン3.22.0で追加された net.snowflake.jdbc.commons_logging_wrapper JVM オプションによって構成されます。詳しくは その他のパラメーター をご覧ください。
ログ構成ファイル¶
あるいは、 ログレベル と、 sf_client_config.json 構成ファイルにログファイルを保存するディレクトリを簡単に指定できます。
注釈
このログ構成ファイル機能は、以下のログレベルのみをサポートします。
DEBUG
ERROR
INFO
OFF
TRACE
WARNING
この構成ファイルは、 JSON を使用して、 log_level と log_path のログパラメーターを以下のように定義します。
{
  "common": {
    "log_level": "DEBUG",
    "log_path": "/home/user/logs"
  }
}
ドライバーは以下の順序で構成の詳細を確認します。
- client_config_file接続パラメーター には、ユーザー定義ログ構成ファイルへのフルパスが含まれます。例:- client_config_file=/opt/snowflake/snowflake_jdbc/my_jdbc_config.json 
- SF_CLIENT_CONFIG_FILE環境変数には、ユーザー定義ログ構成ファイルへのフルパスが入ります。- export SF_CLIENT_CONFIG_FILE=/home/myuser/my_jdbc_config.json 
- JDBC ドライバーのインストールディレクトリ。ファイル名は - sf_client_config.jsonにする必要があります。
- ユーザーのホームディレクトリ。ファイル名は - sf_client_config.jsonにする必要があります。
注釈
- 構成ファイルが前述の場所のいずれにも見つからない場合、ドライバーは Javaコアログ機能 を使用します。 
- client_config_file接続パラメーターまたは- SF_CLIENT_CONFIG_FILE環境変数で指定された構成ファイルが見つからないか、読み取れない場合、ドライバーはエラーメッセージをスローします。
PUT および GET コマンドの無効化¶
デフォルトでは、 JDBC ドライバーは PUT と GET コマンドを実行できます。PUT と GET コマンドによるローカルファイルシステムへのアクセスを許可しない場合は、以下の方法でこれらのコマンドを無効にできます。
- JDBC_ENABLE_PUT_GET サーバーパラメーターを - FALSEに設定します。
- JDBC enablePutGet 接続パラメーターを - falseに設定します。
- SFBaseSession.setEnablePutGet(false)メソッドを呼び出します。
Snowflake JDBC ドライバーの HTTP ヘッダーカスタマイズ機能¶
Snowflake JDBC ドライバーによるリクエストにカスタム HTTP ヘッダーをプログラムで追加するには、 HttpHeadersCustomizer インターフェイスを実装し、実装を登録します。これにより、動的または静的ヘッダーの柔軟でプログラム的な注入が可能になります。
キーとなる考慮事項:
- ドライバーは、該当するリクエスト (Snowflake API、S3、Private Link OCSP) に対して登録されたカスタマイザーを反復します。それから - applies()を呼び出し、次に- newHeaders()を呼び出します(再試行のために- invokeOnce()を尊重します)。
- カスタマイザーはドライバーセットヘッダーを上書きすることはできません。これはドライバーによって強制されます。 
- applies()と- newHeaders()を効率的に使用します。
次の例は、 net.snowflake.client.jdbc.HttpHeadersCustomizer の実装方法を示しています。
public class MyDynamicCustomizer implements HttpHeadersCustomizer {
    public boolean applies(String method, String uri, Map<String, List> headers) {
        return true;
    }
    public Map<String, List<String>> newHeaders() {
        Map<String, List<String>> headers = new HashMap<>();
        headers.put("X-Dynamic-Token", Collections.singletonList("token-" + System.nanoTime()));
        return headers;
    }
    public boolean invokeOnce() {
        return false;
    }
}
次の例は、カスタマイザーを登録するさまざまな方法を示しています。
- net.snowflake.client.jdbc.SnowflakeBasicDataSource経由:- SnowflakeBasicDataSource ds = new SnowflakeBasicDataSource(); // ... set URL, user, password ... List<HttpHeadersCustomizer> myCustomizers = new ArrayList<>(); myCustomizers.add(new MyDynamicHeaderCustomizer()); Properties props = new Properties(); props.put(HttpHeadersCustomizer.HTTP_HEADER_CUSTOMIZERS_PROPERTY_KEY, myCustomizers); ds.setConnectionProperties(props); 
- java.sql.DriverManager経由:- Properties props = new Properties(); // ... set user, password ... List<HttpHeadersCustomizer> myCustomizers = new ArrayList<>(); myCustomizers.add(new MyDynamicHeaderCustomizer()); props.put(HttpHeadersCustomizer.HTTP_HEADER_CUSTOMIZERS_PROPERTY_KEY, myCustomizers); Connection conn = DriverManager.getConnection(jdbcUrl, props); 
トラブルシューティングのヒント¶
プロパティが正しく設定されていることを確認する¶
DriverManager.getConnection() メソッドは、特定の事前定義された名前(「パスワード」、「ウェアハウス」など)に一致するプロパティパラメーターの値のみを読み取ります。プロパティ名のスペルを間違えたり、余分なプロパティを含めたりすると、ドライバーはエラーまたは警告メッセージを出さずに、それらのプロパティを無視します。これにより、小さなスペルミスの検出が困難になる場合があります。
接続文字列とアカウントに正しい値を使用する¶
接続を確立できない場合は、 JDBC 接続文字列でアカウント識別子を正しく指定していることを確認します。アカウント識別子の見つけ方については、 Snowflakeに接続するためのクライアント、ドライバー、ライブラリ、またはサードパーティアプリケーションの構成 をご覧ください。