【问题标题】:Azure SQL database connection issue from an Azure VM by Java JDBC通过 Java JDBC 从 Azure VM 连接 Azure SQL 数据库问题
【发布时间】:2019-12-01 22:34:16
【问题描述】:

我们在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;"

但我们遇到了一个例外:

"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 服务和资源能够访问 Azure db 服务器,我们将 Azure VM 的公共 ip 地址添加到 Azure SQL db 的防火墙设置中
  • 您可以使用刻度使您的帖子更具可读性,like this

标签: java sql azure jdbc


【解决方案1】:

默认情况下,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 Driver for SQL Server 时为connect to an Azure SQL Database。你应该注意这一点:

  • 将服务器名称附加到连接字符串中的 userId

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

  • 使用加密需要设置hostNameInCertificate

在 Microsoft JDBC Driver for SQL Server 7.2 版本之前, 连接到 Azure SQL 数据库时,应指定 hostNameInCertificate 如果您指定 encrypt=true(如果服务器名称 在连接字符串是shortName.domainName,设置 hostNameInCertificate 属性到 *.domainName。)。该物业是 自驱动程序 7.2 版起可选。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-03
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 2021-04-01
      相关资源
      最近更新 更多