我正在尝试使用JDBC连接我的Azure数据库。但它无法连接。我已经正确使用了服务器名,用户名,数据库名和密码。
使用Mysql Connector v8.0.13
import java.sql.*;
import java.util.Properties;
public class MyConnection {
public static Connection getConnection() {
System.out.println("MySQL JDBC driver detected in library path.");
Connection connection = null;
try
{
String url ="jdbc:mysql://<servername>:3306/<databaseName>?useSSL=true&requireSSL=false";
connection = DriverManager.getConnection(url, <username>, <password>);
}
catch (SQLException e)
{
//throw new SQLException("Failed to create connection to database.", e);
}
if (connection != null)
{
System.out.println("Successfully created connection to database.");
}
else {
System.out.println("Failed to create connection to database.");
}
System.out.println("Execution finished.");
return connection;
}
}
我希望显示“已成功创建到数据库的连接”。但其显示为“无法创建与数据库的连接。”
答案 0 :(得分:0)
仅作为评论和我的其他内容的摘要。
正如@LomatHaider所说,由Java代码引起的问题引发了有关时区的错误。根据下面的MySQL官方文档MySQL Server Time Zone Support
。
时区变量
MySQL服务器维护几个时区设置:
系统时区。服务器启动时,它将尝试确定 主机的时区并自动使用它来设置 system_time_zone系统变量。值不变 之后。
要在以下位置显式指定MySQL Server的系统时区: 启动,请在启动mysqld之前设置TZ环境变量。如果 您使用mysqld_safe启动服务器,其--timezone选项提供了 设置系统时区的另一种方法。 TZ的允许值 和--timezone取决于系统。咨询您的操作系统 文档以查看可接受的值。
服务器当前时区。全局time_zone系统变量 指示服务器当前正在运行的时区。 time_zone的初始值为“ SYSTEM”,表示服务器 时区与系统时区相同。
因此,如果从不为MySQL设置时区变量,则MySQL的默认时区设置将遵循OS时区。如我所知,Azure上的默认时区为UTC,则本地或本地客户端连接的时区可能与Azure上的MySQL有所不同,冲突导致此问题的信息如下所示。
java.sql.SQLException: The server time zone value 'Malay Peninsula Standard Time' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
因此,解决此问题的方法如下所示的两个选项:
SET GLOBAL time_zone = timezone;
。?useTimezone=true&serverTimezone=UTC
,以强制对JDBC连接会话使用相同的时区值。有一个博客MySQL JDBC Driver Time Zone Issue :: \[SOLVED\]
对此问题进行了介绍,并通过上面的第二个选项进行了修复。