Azure SQL データベースに接続する
この記事では、SQL Server 用 Microsoft JDBC ドライバー を使用して Azure SQL データベース に接続するときの問題について説明します。 Azure SQL データベース への接続の詳細については、以下を参照してください。
詳細
Azure SQL データベース に接続するには、master データベースに接続して SQLServerDatabaseMetaData.getCatalogs を呼び出す必要があります。
Azure SQL データベース では、ユーザー データベースからカタログ全体を返すことがサポートされていません。 SQLServerDatabaseMetaData.getCatalogs は sys.databases ビューを使用してカタログを取得します。 Azure SQL データベース での SQLServerDatabaseMetaData.getCatalogs の動作を理解するには、「sys.databases (Transact-SQL)」の権限に関する説明を参照してください。
ログイン タイムアウト
Azure SQL データベースに接続する場合、推奨される既定値 loginTimeout
は 30 秒です。 サーバーレス インスタンスに接続する場合は、さらに長い 60 秒以上の loginTimeout
を使うことをお勧めします。 サーバーレス インスタンスがアイドル状態の場合、初回接続時に起動に時間がかかることがあります。 loginTimeout
の設定方法については、「接続プロパティの設定」を参照してください。
接続のドロップ
Azure SQL データベース への接続時、非アクティブな状態が一定時間続くと、ネットワーク コンポーネント (ファイアウォールなど) によってアイドル接続が終了されることがあります。 このコンテキストでのアイドル接続には、次の 2 種類があります。
TCP レイヤーでのアイドル状態。これは、任意の数のネットワーク デバイスによる切断が可能である状態です。
Azure SQL ゲートウェイによるアイドル状態。(TCP から見て接続がアイドル状態ではないため) TCP keepalive メッセージが発生している可能性がありますが、アクティブなクエリが 30 分間発生していません。 この場合、ゲートウェイは、TDS 接続が 30 分間アイドル状態であると判断し、接続を終了します。
2 番目のポイントに対処し、ゲートウェイでアイドル状態の接続が終了されないようにするには、次のようにします。
リダイレクト接続ポリシーを使用して、ご自身の Azure SQL データ ソースを構成します。
ライトウェイト アクティビティを介してアクティブな接続を維持します。 この方法は推奨されません。他に使用できるオプションがない場合にのみ使用してください。
最初のポイントに対処し、ネットワーク コンポーネントによってアイドル接続がドロップされる状況を回避するには、ドライバーが読み込まれているオペレーティング システム上で、次のレジストリ設定 (Windows 以外の場合はこれらに相当する設定) を行います。
レジストリ設定 | 推奨値 |
---|---|
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 秒を超える場合があります。
Note
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=myPassword;encrypt=true;hostNameInCertificate=*.int.mscds.com;