この記事では、Microsoft JDBC Driver for SQL Server を使用して Azure SQL データベースに接続するときの問題について説明します。 Azure SQL データベース への接続の詳細については、以下を参照してください。
詳細
Azure SQL データベース に接続するには、master データベースに接続して SQLServerDatabaseMetaData.getCatalogs を呼び出す必要があります。
Azure SQL データベース では、ユーザー データベースからカタログ全体を返すことがサポートされていません。 カタログを取得するために、SQLServerDatabaseMetaData.getCatalogs によって sys.databases ビューが使用されます。 Azure SQL Database上のSQLServerDatabaseMetaData.getCatalogsの挙動を理解するには、sys.databasesにおける権限に関する議論を参照してください。
ログインタイムアウト
Azure SQLデータベースに接続する際、loginTimeoutデフォルトの30秒が妥当なスタートポイントです。
Azure SQL Database サーバーレス で自動一時停止を有効にしている場合は、データベースの再開中にドライバーの接続再試行に対応できるよう、その値を引き上げてください。 詳細は「 自動一時停止サーバーレスデータベースへの接続」をご覧ください。
loginTimeoutを設定するには、「接続プロパティの設定」をご覧ください。
接続が切断されました
Azure SQL Databaseに接続すると、ファイアウォールなどのネットワークコンポーネントが、しばらくの間非アクティブになった後にアイドル接続を終了させることがあります。 この場合、アイドル状態の接続には2種類あります:
TCP レイヤーでのアイドル状態。これは、任意の数のネットワーク デバイスによる切断が可能である状態です。
Azure SQL ゲートウェイによるアイドル状態。(TCP から見て接続がアイドル状態ではないため) TCP keepalive メッセージが発生している可能性がありますが、アクティブなクエリが 30 分間発生していません。 この場合、ゲートウェイは、TDS 接続が 30 分間アイドル状態であると判断し、接続を終了します。
2 番目のポイントに対処し、ゲートウェイでアイドル状態の接続が終了されないようにするには、次のようにします。
リダイレクト接続ポリシーを使用して、ご自身の Azure SQL データ ソースを構成します。
ライトウェイト アクティビティを介してアクティブな接続を維持します。 この方法は推奨されません。他に使用できるオプションがない場合にのみ使用してください。
最初のポイントに対処し、ネットワーク コンポーネントによってアイドル接続がドロップされる状況を回避するには、ドライバーが読み込まれているオペレーティング システム上で、次のレジストリ設定 (Windows 以外の場合はこれらに相当する設定) を行います。
注
Microsoft JDBC Driver for SQL Server のバージョン 10.2 以降では、ドライバーはデータベース接続中に作成するソケットに次のキープ アライブ値を自動的に設定し、次の表で定義されている OS の既定値をオーバーライドします。 この自動設定は、ソケット キープ アライブ オプションの設定をサポートする Java のバージョンでのみ実行されます。 Linux および macOS では、Java 8 以降の最新の更新プログラムでこの設定がサポートされます。 Windows では、Java 17 以降の最新の更新プログラムがこの設定をサポートしています。
| レジストリ設定 | 推奨値 |
|---|---|
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveTime | 30000 |
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveInterval | 1000 |
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ TcpMaxDataRetransmissions | 10 |
設定後にコンピューターを再起動して、レジストリ設定を有効にします。
KeepAliveTime 値と KeepAliveInterval 値は、ミリ秒単位です。 これらの設定により、応答しない接続が 10 秒から 40 秒以内に切断されます。 キープ アライブ パケットが送信された後、応答が受信されなかった場合は、1 秒ごとに 10 回まで再試行されます。 この時間内に応答が受信されなかった場合、クライアント側ソケットは切断されます。 環境によっては、既知の中断 (仮想マシンの移行など) に対応するために、KeepAliveInterval を増やすことが必要になる可能性があります。これにより、サーバーが応答しない状態が 10 秒を超える場合があります。
注
TcpMaxDataRetransmissions は、Windows Vista や Windows 2008 以降では制御できません。
Azure VM でこれを構成するには、レジストリ キーを追加するスタートアップ タスクを作成します。 たとえば、次のスタートアップ タスクをサービス定義ファイルに追加します。
<Startup>
<Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">
</Task>
</Startup>
次に、AddKeepAlive.cmd ファイルをプロジェクトに追加します。 [出力ディレクトリにコピー] を [常にコピーする] に設定します。 次のスクリプトは、AddKeepAlive.cmd ファイルのサンプルです。
if exist keepalive.txt goto done
time /t > keepalive.txt
REM Workaround for JDBC keep alive on Azure SQL
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime /t REG_DWORD /d 30000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveInterval /t REG_DWORD /d 1000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpMaxDataRetransmissions /t REG_DWORD /d 10 >> keepalive.txt
shutdown /r /t 1
:done
接続文字列内の userId にサーバー名を追加する
SQL Server 用 Microsoft JDBC ドライバー 4.0 より前のバージョンの場合、Azure SQL データベース に接続するには、接続文字列内の UserId にサーバー名を追加する必要がありました。 たとえば、user@servername のように指定していました。 Version 4.0 以降の SQL Server 用 Microsoft JDBC ドライバー では、接続文字列内の UserId に @servername を追加する必要がなくなりました。
暗号化の使用に必要な hostNameInCertificate の設定
SQL Server 用 Microsoft JDBC ドライバー 7.2 より前のバージョンで Azure SQL データベースに接続するには、encrypt=true を指定する場合は、hostNameInCertificate を指定する必要があります (接続文字列のサーバー名が shortName.domainName の場合、hostNameInCertificate プロパティを *.domainName に設定します)。 バージョン 7.2 以降のドライバーでは、このプロパティは省略可能です。
次に例を示します。
jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=<password>;encrypt=true;hostNameInCertificate=*.int.mscds.com;