本主题讨论使用 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;