我正在尝试使用 JDBC 连接我的 Azure 数据库。但它无法连接。我正确使用了服务器名称,用户名,数据库名称和密码。
使用 Mysql 连接器 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;
}
}
我期望显示"已成功创建与数据库的连接",但它显示"无法创建与数据库的连接"。
就像评论和我的附加内容的摘要一样。
正如@LomatHaider所说,由Java代码引起的问题引发了有关时区的错误。根据MySQL官方文件MySQL Server Time Zone Support
,如下。
时区变量
MySQL 服务器维护多个时区设置:
系统时区。当服务器启动时,它会尝试确定 主机的时区自动并使用它来设置 system_time_zone系统变量。值不变 此后。
显式指定 MySQL 服务器的系统时区 启动时,在启动 mysqld 之前设置 TZ 环境变量。如果 您使用mysqld_safe启动服务器,其 --时区选项提供 设置系统时区的另一种方法。TZ的允许值 和 --时区取决于系统。咨询您的操作系统 文档以查看可接受的值。
服务器当前时区。全局time_zone系统变量 指示服务器当前运行的时区。这 初始time_zone值为"SYSTEM",表示服务器 时区与系统时区相同。
因此,如果从未为 MySQL 设置时区变量,则 MySQL 中的默认时区设置将遵循操作系统时区。众所周知,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.
因此,修复它的解决方案如下两个选项:
- 按照MySQL官方文档以超级权限
SET GLOBAL time_zone = timezone;
。 - 添加连接字符串中
?useTimezone=true&serverTimezone=UTC
的其他参数,以强制对 JDBC 连接会话使用相同的时区值。
有一个博客MySQL JDBC Driver Time Zone Issue :: [SOLVED]
引入了与此相同的问题,并通过上面的第二个选项修复它。