连接到 Azure SQL 数据库
本文介绍了在使用 Microsoft JDBC Driver for SQL Server 连接到 Azure SQL 数据库 时遇到的问题。 若要详细了解如何连接到 Azure SQL 数据库,请参阅:
详细信息
若要连接到 Azure SQL 数据库,应连接到 master 数据库,以调用 SQLServerDatabaseMetaData.getCatalogs。
Azure SQL 数据库 不支持从用户数据库中返回整个目录集。 SQLServerDatabaseMetaData.getCatalogs 使用 sys.databases 视图获取目录 。 请参阅 sys.databases (Transact-SQL) 中有关权限的讨论,以了解 Azure SQL 数据库 上的 SQLServerDatabaseMetaData.getCatalogs 行为。
登录超时值
连接到 Azure SQL 数据库时,建议的默认 loginTimeout
为 30 秒。 如果要连接到无服务器实例,建议使用更长的 loginTimeout
- 60 秒或更长时间。 如果无服务器实例处于空闲状态,则在初始连接时唤醒它可能需要一些时间。 有关如何设置 loginTimeout
的详细信息,请参阅设置连接属性。
删除的连接
连接到 Azure SQL 数据库 时,空闲连接可能在一段时间不活动后被网络组件(如防火墙)终止。 在此上下文中,有两种类型的空闲连接:
TCP 层出现空闲,在此情形下,任意数量的网络设备都可以删除连接。
Azure SQL 网关出现空闲,在此情形下,可能会发生 TCP keepalive 消息(使连接从 TCP 的角度看不再空闲),但在 30 分钟内没有活动的查询。 在这种情况下,网关将确定 TDS 连接处于空闲状态已有 30 分钟,因此将中止连接。
若要解决第二个问题并避免网关终止空闲连接,可以执行以下操作:
使用重定向连接策略来配置 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 秒内断开。 如果在发送保持连接数据包后没有收到响应,则每秒会重试一次,最多可重试 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
在低于 Microsoft JDBC Driver for SQL Server 4.0 的版本中,若要连接到 Azure SQL 数据库,需要将服务器名称追加到连接字符串中的 UserId。 例如 user@servername。 从 Microsoft JDBC Driver for SQL Server 4.0 版本开始,不再要求将 @@servername 追加到连接字符串中的 UserId。
使用加密需要设置 hostNameInCertificate
在低于 Microsoft JDBC Driver for SQL Server 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;