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 アプリケーション サーバーと連携します。
出発点を選択する
- Java開発環境を設定し、最初のクエリを実行するには、まず、手順 1: 開発環境の構成、手順 2: SQL データベースの作成、および手順 3: Javaを使用した SQL への接続の概念実証から始めます。
- パスワードレス認証を使用してAzure SQLに接続するには、まず、Microsoft Entra認証を使用して接続し、接続 URL を構築します。
- Maven、Gradle、またはその他のビルドにドライバーを追加するには、「JDBC Driver for SQL Server Microsoftダウンロードする」に移動します。
- 既存のアプリに一時的な障害に対する回復性を確保するには、「 接続の回復性 」と 「構成可能な再試行ロジック」を参照してください。
- 接続またはクエリの問題を診断するには、「 JDBC ドライバーに関する問題の診断 」および「 接続のトラブルシューティング」を参照してください。
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を設定しません。これは、ドライバーがconnectRetryCountとconnectRetryIntervalによって制御される形で、最も一般的な 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)。
この構成の各部分の詳細については、以下を参照してください。
- 接続 URL の構築
- 接続プロパティを設定する
- Microsoft Entra 認証を使用して接続する
- 接続の回復性
- 構成可能な再試行ロジック
- 高可用性、ディザスター リカバリーのための JDBC ドライバーのサポート
- JDBC ドライバーのタイムアウト プロパティについて
Azure SQL一時的なエラーのカタログについては、「一時的な接続エラーのトラブルシューティング」を参照してください。
主要な機能
-
標準ベースの JDBC: タイプ 4 ドライバー。 JRE 11 以降のビルドでは、JDBC 4.2 と JDBC 4.3 要求境界メソッド (
beginRequest、endRequest) とStatementクォート ヘルパーが実装されています。 JDBC 4.3 シャーディング API(setShardingKey、createConnectionBuilder群)は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: 機密列のクライアント側暗号化。インプレース操作のための省略可能なセキュア エンクレーブに対応。
-
一括コピー:
SQLServerBulkCopyAPI を使用した高スループットの挿入と、executeBatchのバッチ挿入のパフォーマンス。 -
接続の回復性: 一時的なエラーに対する組み込みの接続再試行に加えて、ステートメント (
retryExec) の構成可能な再試行ロジックとカスタマイズ可能な接続エラーリスト (retryConn) をオプトインします。 - 豊富なSQL Serverデータ型のサポート: datetimeoffset、sql_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 ドライバーのタイムアウト プロパティについて |
loginTimeout、queryTimeout、ソケットタイムアウト、それらがどのように相互作用するか。 |
| 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 |
|---|---|
| ステートメントおよび結果セットの操作 |
Statement、PreparedStatement、および結果セットの基本。 |
| 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 |
|---|---|
| トランザクションの実行 |
commit、 rollback、および自動コミット セマンティクス。 |
| トランザクションについて | トランザクションのライフサイクルとベスト プラクティス。 |
| 分離レベル | スナップショット、読み取りコミット済み、シリアル化可能など。 |
| 同時実行制御 | オプティミスティックコンカレンシー戦略とペシミスティック コンカレンシー戦略。 |
| 行のロック | SQL Server行ロックを取得および解放する方法。 |
| セーブポイントの使用 | トランザクション内での部分ロールバック。 |
| トランザクション サイズの管理 | トランザクション スコープを調整して、実行時間の長いロックを回避します。 |
| XA トランザクション |
SQLServerXADataSourceを使用した 2 フェーズ コミット。 |
パフォーマンスと信頼性
| [アーティクル] | Description |
|---|---|
| パフォーマンスと信頼性の向上 | インデックス、クエリ、ドライバー レベルのチューニング。 |
| 準備されたステートメントメタデータのキャッシュ | 準備されたステートメント プランを再利用します。 |
| 準備されたステートメント パラメーターのパフォーマンス | パラメーターの入力と実行プランの再利用。 |
| アダプティブ バッファリング | 大きな列をメモリに完全に読み込まずにストリーミングします。 |
| 使用されていないオブジェクトを閉じる |
Statement、ResultSet、Connection のリソースをすぐに解放できます。 |
| 高可用性とディザスター リカバリー | 可用性グループ リスナーとマルチサブネット フェールオーバー。 |
| データベース ミラーリング | データベース ミラーリング パートナーと共にドライバーを使用します。 |
診断とトラブルシューティング
| [アーティクル] | 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 ドライバー アプリケーション | エンド ツー エンドのコード サンプル。 |
| よくある質問 | よく寄せられる質問。 |