Java JDBC导致Azure VM出现Azure SQL数据库连接问题

Java JDBC导致Azure VM出现Azure SQL数据库连接问题,java,sql,azure,jdbc,Java,Sql,Azure,Jdbc,我们在Azure虚拟机(VM)中有一个java项目,需要通过JDBC连接连接到Azure SQL db,因此我们使用Azure SQL db提供的JDBC连接字符串,如下所示: jdbc:sqlserver://ZZZdbserver.database.windows.net:1433;database=ZZZ;user=******;password=***;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.da

我们在Azure虚拟机(VM)中有一个java项目,需要通过JDBC连接连接到Azure SQL db,因此我们使用Azure SQL db提供的JDBC连接字符串,如下所示:

jdbc:sqlserver://ZZZdbserver.database.windows.net:1433;database=ZZZ;user=******;password=***;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;” 但我们有一个例外:

org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Cannot open server "ZZZ1" requested by the login.  The login failed.)
“java.security.cert.CertificateException:在安全套接字层(SSL)初始化期间验证证书中的服务器名称失败。
服务器名称为*.database.windows.net,证书中的名称为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虚拟机的用户名


有没有办法解决这个问题?

默认情况下,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数据库属性中的服务器管理员登录访问此数据库。此外,您可以参考使用Java连接以访问Azure SQL数据库

当使用Microsoft JDBC驱动程序进行SQL Server时。请注意:

  • 将服务器名称附加到连接字符串中的用户标识
在4.0版本的Microsoft JDBC SQL Server驱动程序之前, 连接到Azure SQL数据库时,需要附加 连接字符串中用户ID的服务器名称。例如 user@servername. 从Microsoft JDBC驱动程序的4.0版开始 对于SQL Server,不再需要将@servername附加到 连接字符串中的UserId

  • 使用加密需要设置
    hostnameInertificate
在针对SQL Server的Microsoft JDBC驱动程序的7.2版本之前, 连接到Azure SQL数据库时,应指定
hostNameInCertificate
如果指定encrypt=true(如果服务器名 在连接字符串shortName.domainName中,设置
hostNameInCertificate
property to*.domainName.)。这个物业是 从驱动程序的7.2版起为可选


希望这有帮助。

如果我需要设置encrypt=true和hostNameInCertificate=cr2.eastus1-a.control.database.windows.net。我需要在哪里从Azure SQL DB的服务获取cr2.eastus1-a.control.database.windows.net的证书?

顺便说一句,为了使Azure服务和资源能够访问Azure DB服务器,我们将Azure VM的公共ip地址添加到Azure SQL DB的防火墙设置中。您可以使用勾号使您的帖子更具可读性,
像这样