我们在Azure虚拟机(VM)中有一个Java项目,并且需要通过JDBC连接连接到Azure SQL数据库,因此我们使用Azure SQL数据库提供的JDBC连接字符串如下:
"jdbc:sqlserver://ZZZdbserver.database.windows.net:1433;database=ZZZ;user=*****;password=*****;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
但我们有一个例外:
"java.security.cert.CertificateException: Failed to validate the server name in a certificate during Secure Sockets Layer (SSL) initialization.
The server name is *.database.windows.net, the name in certificate is cr2.eastus1-a.control.database.windows.net."
然后我们将JDBC连接字符串更新为:
"jdbc:sqlserver://ZZZdbserver.database.windows.net:1433;database=ZZZ;user=*****;password=*****;encrypt=true;trustServerCertificate=false;hostNameInCertificate=cr2.eastus1-a.control.database.windows.net;loginTimeout=30;"
但我们还有另一个例外:
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Cannot open server "ZZZ1" requested by the login. The login failed.)
其中“ ZZZ1”是我们用于Azure VM的用户名。
有解决这个问题的主意吗?
默认情况下,Azure VM尚未阻止与Internet的出站连接。您可以首先通过运行CMD中的命令telnet ZZZdbserver.database.windows.net 1433
或Powershell中的Test-NetConnection -computer ZZZdbserver.database.windows.net -port 1433
来验证从VM到Azure SQL数据库的网络连接。如果失败,则可以检查是否有任何防火墙阻止此数据库连接或端口,或者您的应用程序正在该端口上侦听,或者您的SQL数据库处于联机状态。
此外,如果网络连接成功,则可以在用于连接数据库时验证用户名或密码是否正确。确保没有任何错字。此外,用户名应具有足够的特权来访问该数据库。您可以尝试通过SQL数据库属性中的Server admin login
访问此数据库。此外,您可以参考this sample code以使用Java连接来访问Azure SQL数据库。
当使用Microsoft JDBC驱动程序将SQL Server用于connect to an Azure SQL Database时。您应该注意这一点:
在用于SQL Server的Microsoft JDBC驱动程序的4.0版本之前,连接到Azure SQL数据库时,需要附加连接字符串中UserId的服务器名称。例如,用户名@服务器名。从Microsoft JDBC驱动程序的版本4.0开始对于SQL Server,不再需要将@servername附加到连接字符串中的UserId。
hostNameInCertificate
在用于SQL Server的Microsoft JDBC驱动程序的7.2版之前,连接到Azure SQL数据库时,应指定
hostNameInCertificate
如果您指定crypto = true(如果服务器名称在连接字符串为shortName.domainName时,设置* .domainName的hostNameInCertificate
属性。)。该属性是从驱动程序的7.2版本开始是可选的。