SQL Server 用 Microsoft JDBC ドライバー

JDBC ドライバーのダウンロード

Microsoft Java Database Connectivity (JDBC) Driver for SQL Server は、Type 4 JDBC ドライバー (純粋なJava、SQL Server TDS プロトコルを直接通信します。ネイティブ ライブラリは必要ありません)、Javaアプリケーションまたはアプリケーション サーバーがSQL Serverに接続できるようにします。Microsoft Fabric内の Azure SQL Database、Azure SQL Managed Instance、および SQL データベース。 標準の JDBC API を実装し、IBM WebSphere や SAP NetWeaver を含む主要なJava アプリケーション サーバーと連携します。

出発点を選択する

Azure SQLの運用ベースライン

このスニペットは、運用環境向けのAzure SQL接続の開始点として使用します。 アプリケーションの設定、環境変数、構成ファイル Azure App Serviceなどのアプリケーション構成からサーバー名とデータベース名を読み込み、残りの接続プロパティをプログラムで設定します。 この構成では、トランスポート層セキュリティ (TLS)、マネージド ID、一時的な障害時の接続の再試行、高速フェールオーバー グループの復旧、コールド スタート フェールオーバーに対応するためのログイン タイムアウトの長さ、およびAzure SQL調整またはクエリ途中フェールオーバーにヒットするステートメントの構成可能な再試行ロジック (CRL) が組み合わせられます。

セキュリティを強化し、スケールアウトを容易にするために、コードの外部に接続情報を保持します。 運用環境では、アプリケーションの構成システムに接続情報を格納し、機密性の高い値と一元管理された接続設定にAzure Key Vaultを使用します。 詳細については、「接続文字列の セキュリティ保護」を参照してください。

この記事のJava スニペットでは、簡潔にするためにインポートとクラス ラッパーを省略しています。

// Load endpoint details from application configuration. In Azure App Service,
// these can come from app settings or Key Vault-backed settings.
String serverName = System.getenv("SQL_SERVER_NAME");
String databaseName = System.getenv("SQL_DATABASE_NAME");
String port = System.getenv().getOrDefault("SQL_PORT", "1433");

if (serverName == null || databaseName == null) {
    throw new IllegalStateException(
            "Set SQL_SERVER_NAME and SQL_DATABASE_NAME in your application configuration.");
}

String url = "jdbc:sqlserver://" + serverName + ":" + port;

Properties props = new Properties();
props.setProperty("databaseName", databaseName);
props.setProperty("encrypt", "true");
props.setProperty("trustServerCertificate", "false");
props.setProperty("authentication", "ActiveDirectoryManagedIdentity");
props.setProperty("loginTimeout", "120");         // 90 is the minimum floor for this retry profile; 120 leaves practical failover margin
props.setProperty("connectRetryCount", "5");     // retry transient connection failures up to 5 times (default 1)
props.setProperty("connectRetryInterval", "15"); // 15 seconds between connection retries (default 10)
props.setProperty("multiSubnetFailover", "true"); // recommended for any Azure SQL HA listener
// props.setProperty("applicationIntent", "ReadOnly"); // uncomment to route to a readable secondary
// Retry deadlocks and lock timeouts, plus Azure SQL throttling and mid-query failover.
props.setProperty("retryExec", "1205,1222:3,5+5;40501,40613,40197,10928,10929,49918:4,5*2");

try (Connection conn = DriverManager.getConnection(url, props);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT 1")) {
    while (rs.next()) {
        System.out.println(rs.getInt(1));
    }
}

このスニペットは、Azure SQL Database のフェールオーバー グループと Azure SQL Managed Instance 向けに調整されています。

フェールオーバー グループ リスナー、可用性グループ リスナー、またはフェールオーバー クラスター インスタンス エンドポイントに接続する場合にのみ、 multiSubnetFailover=true を設定します。 高可用性 (HA) リスナーではないエンドポイントに対してこのプロパティを使用すると、パフォーマンスが低下する可能性があり、サポートされていません。 詳細については、 高可用性、ディザスター リカバリーに対する JDBC ドライバーのサポートを参照してください。

このスニペットではretryConnを設定しません。これは、ドライバーがconnectRetryCountconnectRetryIntervalによって制御される形で、最も一般的な Azure SQL の一過性の接続エラー(4060、40197、40501、40613、49918、49919、49920、10928、10929 を含む)に対して標準で再試行を行うためです。 完全な一覧については、 組み込みの一時的な接続エラーの一覧を参照してください。 まだカバーされていないエラーでリストを拡張する必要がある場合にのみ、retryConn+<errorNumber>を追加するか、<errorNumber> (先頭の+なし) に設定して置き換えます。 JDBC URL に同じ値を配置する場合は、 retryConn={+<errorNumber>} または retryConn={<errorNumber>}としてラップします。

retryExec プロパティには 2 つの部分があり、プログラムで設定するとrule1;rule2として記述されます。 JDBC URL に同じ値を配置する場合は、各ルールを {rule1};{rule2}として中かっこで囲みます。

  • {1205,1222:3,5+5} は、デッドロックの対象 (1205) とロック要求タイムアウト (1222) を 3 回再試行し、5、10、15 秒の線形バックオフを行います。 1205 の場合、SQL Serverドライバーがエラーを確認する前にトランザクションをロールバックするため、1 つのステートメントを再実行しても安全です。 デッドロックされたステートメントがマルチステートメント トランザクションの一部であった場合、以前のステートメントもロールバックされ、CRL はそれらを再生しないため、トランザクション全体を独自の再試行ループでラップします。 1222 はトランザクションを開いたままにし、ステートメント レベルの再試行では元のトランザクション内のステートメントのみが再実行されます。トランザクション期間もバインドする必要がある場合は、トランザクション全体を独自の再試行ループでラップします。

  • {40501,40613,40197,10928,10929,49918:4,5*2}は、5、10、20、40 秒の指数バックオフを使用して、Azure SQL調整、中間クエリ フェールオーバー、およびリソース制限エラーを 4 回再試行します。 これらのエラーは、connect ループ用の組み込みの一時エラー一覧に含まれていますが、確立済みの接続に対するクエリの途中で発生した場合は、retryExec がそれらを捕捉します。 CRL バックオフは、 queryTimeoutによって制限されます。 queryTimeout次の計画された待機よりも低く設定すると、ドライバーは早期に停止し、再スローします。 CRL の待機時間とステートメントの実行時間の合計以上の queryTimeout を選択するか、最長のバックオフは実行されないことを許容してください。

Azure SQL Database のフェールオーバー グループ、Hyperscale の名前付きレプリカと読み取りスケールアウト、または Always On 可用性グループ リスナーの場合は、読み取り可能なセカンダリに接続するときに applicationIntent=ReadOnly を設定します。 証明書サブジェクトの別名 (SAN) に接続先のホストが含まれていないソブリン クラウドの場合は、一致するようにhostNameInCertificateも設定します (たとえば、Azure Governmentの*.database.usgovcloudapi.net)。

この構成の各部分の詳細については、以下を参照してください。

Azure SQL一時的なエラーのカタログについては、「一時的な接続エラーのトラブルシューティング」を参照してください。

主要な機能

  • 標準ベースの JDBC: タイプ 4 ドライバー。 JRE 11 以降のビルドでは、JDBC 4.2 と JDBC 4.3 要求境界メソッド (beginRequestendRequest) と Statement クォート ヘルパーが実装されています。 JDBC 4.3 シャーディング API(setShardingKeycreateConnectionBuilder 群)は SQLFeatureNotSupportedException をスローします。 JRE 8 ビルドでは、JDBC 4.2 が実装されています。 バージョンごとの内訳と、サポートされているメソッドとサポートされていない 4.3 メソッドの完全な一覧については、Javaおよび JDBC 仕様のサポートを参照してください。
  • 広範なプラットフォームのサポート: Windows、Linux、macOS など、サポートされている Java 仮想マシン (JVM) を持つ任意のプラットフォームで実行されます。
  • 既定で暗号化: 現在のドライバーの既定値として encrypt=true を使用する TLS で暗号化された接続。
  • Microsoft Entra ID認証: マネージド ID、サービス プリンシパル、対話型、統合、既定の資格情報チェーン、アクセス トークン フローを使用したパスワードレス接続。
  • Kerberos: オンプレミスの Active Directoryの統合認証。
  • NTLM: ドメイン非参加環境またはレガシ シナリオ向けの Windows のチャレンジ/レスポンス認証。
  • Always Encrypted: 機密列のクライアント側暗号化。インプレース操作のための省略可能なセキュア エンクレーブに対応。
  • 一括コピー: SQLServerBulkCopy API を使用した高スループットの挿入と、 executeBatchのバッチ挿入のパフォーマンス。
  • 接続の回復性: 一時的なエラーに対する組み込みの接続再試行に加えて、ステートメント (retryExec) の構成可能な再試行ロジックとカスタマイズ可能な接続エラーリスト (retryConn) をオプトインします。
  • 豊富なSQL Serverデータ型のサポート: datetimeoffsetsql_variant、JSON、空間、ベクター、テーブル値パラメーター、ユーザー定義型。

概要

[アーティクル] Description
システム要件 サポートされているJava、オペレーティング システム、およびSQL Serverバージョン。
サポート マトリックス JDBC ドライバーリリースの詳細な互換性マトリックス。
Microsoft SQL Server 用 JDBC Driver のダウンロード リンク、Maven 座標、リリース成果物をダウンロードします。
JDBC ドライバーの概要 ドライバーをインストールし、環境を構成して、最初のクエリを実行します。
JDBC ドライバーの概要 アーキテクチャ、サポートされている機能、JDBC 仕様のコンプライアンス。

構成と接続

[アーティクル] Description
JDBC ドライバーによる SQL Server への接続 JavaからSQL Server インスタンスへの接続を開きます。
Azure SQL Database への接続 Java アプリケーションをAzure SQL Databaseに接続します。
接続 URL の構築 jdbc:sqlserver:// URL の構文とプロパティの完全なリファレンス。
接続プロパティを設定する すべての接続プロパティ、既定値、および設定方法。
データ ソースのプロパティの設定 JNDI およびアプリ・サーバーで使用する SQLServerDataSource を構成します。
接続の操作 接続を正しく開き、再利用し、閉じます。
接続プーリングの使用 JNDI データ ソースと外部プールとの統合。
接続の回復性 組み込みの接続再試行と接続の切断検出。
構成可能な再試行ロジック retryExecで失敗したステートメントを再試行し、retryConnを使用して接続再試行リストをカスタマイズします。
JDBC ドライバーのタイムアウト プロパティについて loginTimeoutqueryTimeout、ソケットタイムアウト、それらがどのように相互作用するか。
JDBC ドライバーの展開 アプリケーションでドライバーをパッケージ化して展開します。

Authenticate

[アーティクル] Description
Microsoft Entra 認証 マネージド ID 認証、サービス プリンシパル認証、対話型認証、統合認証、アクセストークン認証。
Kerberos 統合認証 Kerberos とActive Directoryを使用して接続します。
NTLM 認証 NTLM 資格情報を使用して認証します。
ループバック シナリオのクライアント証明書認証 ループバック接続で証明書を使用してクライアントを認証します。

セキュリテイ保護

[アーティクル] Description
JDBC ドライバー アプリケーションのセキュリティ保護 ドライバーを使用するJava アプリケーションのセキュリティ ガイダンス。
アプリケーションのセキュリティ 脅威モデルと多層防御の推奨事項。
接続文字列のセキュリティ保護 資格情報と接続文字列をソースから除外します。
暗号化のためのクライアントの構成 信頼ルート、証明書のピン留め、TLS 設定。
暗号化を使用した接続 encrypt=true を強制し、サーバー証明書を検証します。
暗号化のサポートについて ドライバーが TLS をSQL Serverとネゴシエートする方法。
ユーザー入力の検証 SQL をパラメーター化し、挿入を回避します。
FIPS モード FIPS 準拠環境でドライバーを実行します。
常に暗号化 機密性の高い列のクライアント側暗号化を構成します。
セキュリティで保護されたエンクレーブが設定された Always Encrypted 暗号化された列に対して豊富な操作を有効にします。
Always Encrypted API リファレンス 列暗号化プロバイダーとキー ストアの API サーフェス。

データの操作

[アーティクル] Description
ステートメントおよび結果セットの操作 StatementPreparedStatement、および結果セットの基本。
JDBC ドライバーでのステートメントの使用 パラメーター化されたステートメントとパラメーター化されていないステートメントを実行します。
複雑なステートメントの処理 ストアドプロシージャ、複数の結果セット、更新件数。
結果セットの処理 クエリ結果を反復処理、更新、スクロールします。
複数の結果セットの使用 複数の結果セットを返すクエリを処理します。
カーソルの種類について 順方向専用、スクロール可能、および更新可能なカーソル。
テーブル値パラメーターの使用 TABLEパラメーターをストアド プロシージャに渡します。
JDBC ドライバーでの一括コピーの使用 SQLServerBulkCopyによる高速挿入。
バッチ挿入用の一括コピー API INSERTワークロード向けにexecuteBatchを高速化します。
バッチ操作の実行 バッチ挿入、更新、および削除。

データの種類

[アーティクル] Description
データ型の操作 Java型をSQL Server型にマップします。
JDBC ドライバーのデータ型について ドライバーの種類のシステムと JDBC のマッピング。
データ型の変換 JavaとSQL Serverの間の暗黙的および明示的な変換。
データ型の違い 境界を越えて型をマッピングする場合のエッジ ケース。
JSON データ型 JSON 列を格納してクエリを実行します。
空間データ型 Javaのジオメトリ地理を使用します。
ベクトル データ型 SQL Server ベクター型を操作します。
sql_variant sql_variant列の読み取りと書き込み。
ユーザー定義型 Javaの CLR ユーザー定義型を使用します。
各国語文字セットのサポート Unicode 処理と nvarchar 列。
国際機能 ロケール、照合順序、グローバリゼーションに関する考慮事項。

トランザクションとコンカレンシー

[アーティクル] Description
トランザクションの実行 commitrollback、および自動コミット セマンティクス。
トランザクションについて トランザクションのライフサイクルとベスト プラクティス。
分離レベル スナップショット、読み取りコミット済み、シリアル化可能など。
同時実行制御 オプティミスティックコンカレンシー戦略とペシミスティック コンカレンシー戦略。
行のロック SQL Server行ロックを取得および解放する方法。
セーブポイントの使用 トランザクション内での部分ロールバック。
トランザクション サイズの管理 トランザクション スコープを調整して、実行時間の長いロックを回避します。
XA トランザクション SQLServerXADataSourceを使用した 2 フェーズ コミット。

パフォーマンスと信頼性

[アーティクル] Description
パフォーマンスと信頼性の向上 インデックス、クエリ、ドライバー レベルのチューニング。
準備されたステートメントメタデータのキャッシュ 準備されたステートメント プランを再利用します。
準備されたステートメント パラメーターのパフォーマンス パラメーターの入力と実行プランの再利用。
アダプティブ バッファリング 大きな列をメモリに完全に読み込まずにストリーミングします。
使用されていないオブジェクトを閉じる StatementResultSetConnection のリソースをすぐに解放できます。
高可用性とディザスター リカバリー 可用性グループ リスナーとマルチサブネット フェールオーバー。
データベース ミラーリング データベース ミラーリング パートナーと共にドライバーを使用します。

診断とトラブルシューティング

[アーティクル] Description
JDBC ドライバーに関する問題の診断 トレース、ログ記録、および一般的なエラー モード。
接続のトラブルシューティング 接続エラー、TLS ハンドシェイクエラー、および名前付きインスタンス。
ドライバーの動作の追跡 ドライバーの JDK ログを有効にします。
パフォーマンス ロガーとコールバック ステートメントごとのパフォーマンス メトリックをキャプチャします。
拡張イベント ログ クライアント エラーをサーバー側の拡張イベントと関連付けます。
エラーの処理 SQLException、エラー コード、再試行ヒント。
[アーティクル] Description
リリースノート バージョン履歴と各リリースの新機能。
機能の依存関係 Entra ID、Kerberos、Always Encrypted などのオプションの依存関係。
JDBC 4.3 コンプライアンス JDBC 4.3 API の準拠。
JDBC 4.2 コンプライアンス JDBC 4.2 API の準拠。
JDBC 4.1 コンプライアンス JDBC 4.1 API の準拠。
コンプライアンスと法律 仕様のコンプライアンスとライセンス。
JDBC ドライバーの API リファレンス ドライバーによって公開されるクラス、インターフェイス、メソッド、フィールド。
サンプル JDBC ドライバー アプリケーション エンド ツー エンドのコード サンプル。
よくある質問 よく寄せられる質問。