本主题讨论使用 Microsoft JDBC Driver for SQL Server 连接到 SQL Azure 数据库时遇到的问题。有关 SQL Azure 数据库的详细信息,请参阅:

详细信息

在 SQL Azure 上,您应连接到 master 数据库以调用 SQLServerDatabaseMetaData.getCatalogs

SQL Azure 不支持从用户数据库中返回整个目录集。SQLServerDatabaseMetaData.getCatalogs 使用 sys.databases 视图获取目录。请参考 sys.databases(SQL Azure 数据库)中讨论的权限来了解 SQL Azure 上的 SQLServerDatabaseMetaData.getCatalogs 行为。

删除的连接

连接到 SQL Azure 时,空闲连接在处于不活动状态一定时间后可能被某个网络组件(如防火墙)终止。为了避免网络组件删除空闲连接,应在加载驱动程序的操作系统上设置以下注册表设置(或非 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\TcpMaxDataRetransmission

10

然后必须重新启动计算机,注册表设置才能生效。

为此,在 Windows Azure 中运行时,创建一个启动任务来添加注册表项。例如,将以下启动任务添加到服务定义文件:

<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 SQL Azure
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 TcpMaxDataRetransmission /t REG_DWORD /d 10 >> keepalive.txt
shutdown /r /t 1
:done
将服务器名称追加到连接字符串中的 UserId

在 Microsoft JDBC Driver for SQL Server 4.0 之前的版本中,连接到 SQL Azure 数据库时,要求您将服务器名称追加到连接字符串中的 UserId,例如 user@servername。从 Microsoft JDBC Driver for SQL Server 4.0 版本开始,不再要求将 @servername 追加到连接字符串中的 UserId。

使用加密要求设置 hostNameInCertificate

连接到 SQL Azure 时,如果指定 encrypt=true,应指定 hostNameInCertificate。(如果连接字符串中的服务器名称为 shortName.domainName,则将 hostNameInCertificate 属性设置为 *.domainName。)

例如:

jdbc:sqlserver://abcd.int.mscds.com;databaseName= myDatabase;user=myName;password=myPassword;encrypt=true;hostNameInCertificate= *.int.mscds.com;

请参阅