mysql 8连接超时问题

本文记录了一次MySQL连接配置中遇到的时区问题及解决过程。主要问题为尝试连接数据库服务器失败,通过检查时区配置发现实际系统时间为UTC而非预设的CST,将serverTimezone参数更改为UTC后问题得以解决。

1. 问题描述

1.1 连接配置

主要看:serverTimezone=CST

jdbc:mysql://10.1.195.28:3306/demo?characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false&serverTimezone=CST&allowPublicKeyRetrieval=true
1.2 报错内容

主要看:Could not create connection to database server. Attempted reconnect 3 times. Giving up.

2021-05-10 12:45:20.070 ERROR [Druid-ConnectionPool-Create-1390268527] c.a.druid.pool.DruidDataSource - create connection SQLException, url: jdbc:mysql://10.1.195.28:3306/demo?characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false&serverTimezone=CST&allowPublicKeyRetrieval=true, errorCode 0, state 08001
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
        at com.mysql.jdbc.Util.getInstance(Util.java:387)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:917)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
        at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2165)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2090)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)
        at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1570)
        at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1636)
        at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2505)
Caused by: java.lang.NullPointerException: null
        at com.mysql.jdbc.ConnectionImpl.getServerCharset(ConnectionImpl.java:3005)
        at com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1916)
        at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1845)
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1215)
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2255)
        at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2106)
        ... 13 common frames omitted

2. 解决方案

这坑人的mysql,网上一会儿说时区改成CST,一会儿说时区改成GMT,至于应该用什么,需要用date命令进行查看:

Mon May 10 12:49:07 UTC 2021

原来需要改成serverTimezone=UTC,问题解决。

<think>嗯,用户遇到了Druid数据源创建连接时出现的SQLException问题,错误代码是0,状态是08001。首先,我需要根据提供的引用信息来分析可能的原因。引用中提到错误代码1045通常与权限问题有关,比如用户名或密码错误,但用户现在的错误代码是0,状态08001,这可能和网络连接或驱动配置有关。 首先,检查数据库连接参数是否正确。用户提供的引用中有多个例子,比如检查application配置文件中的用户名、密码、URL是否正确,尤其是密码是否写成字符类型。如果URL中有特殊字符,比如&符号是否正确转义为&,这也是常见问题,引用4里提到过。 其次,网络连通性。状态08001通常指客户端无法建立到服务器的连接。需要确认MySQL服务是否正在运行,端口3306是否开放,防火墙有没有阻止连接。用户可能是在本地环境,所以检查localhost是否正确,或者是否应该使用127.0.0.1。 然后是驱动问题。引用3和4提到了驱动类名是否正确,比如com.mysql.cj.jdbc.Driver是否正确配置,特别是MySQL版本是否兼容。如果使用较新的MySQL版本,可能需要更新驱动,或者检查时区设置,比如在URL中添加serverTimezone参数。 另外,SSL设置也可能导致问题。引用2和4中的URL示例有的用了useSSL=true,有的用了false。如果MySQL服务器没有配置SSL,而客户端启用了,可能会导致连接失败。可以尝试将useSSL设置为false,或者正确配置SSL证书。 还有,Druid的配置参数是否正确。比如初始连接数、最大活跃连接数等是否合理,引用中提到需要检查连接池配置是否合理,防止资源耗尽。此外,Druid的日志级别可能需要调整,以便获取更详细的错误信息,帮助排查问题。 用户之前可能遇到的错误代码1045是权限问题,但现在错误代码不同,所以可能需要不同的解决步骤。比如,检查是否使用了正确的JDBC URL格式,特别是时间区域参数是否正确。如果URL中有多余的空格或拼写错误,也可能导致连接失败。 最后,建议用户分步骤检查:先确认MySQL服务状态,再检查连接参数,然后验证驱动和依赖,接着调整SSL和时区设置,最后查看Druid的配置。如果问题依旧,可能需要查看更详细的日志或使用测试工具排除其他因素。</think>针对Druid数据源创建连接时出现的`SQLException`(错误代码0,状态08001)问题,以下是逐步排查与解决方案: --- ### 一、错误原因分析 错误状态码`08001`通常表示**客户端与数据库服务器建立连接失败**,可能涉及以下原因: 1. 数据库服务未启动或网络不通 2. JDBC连接参数配置错误(用户名/密码/IP/端口) 3. 数据库驱动不匹配或缺失 4. SSL证书配置问题 5. 防火墙或权限限制 --- ### 二、排查步骤与解决方案 #### 1. 检查数据库服务状态 - **验证MySQL服务是否运行**: ```bash # Linux/Mac systemctl status mysql # Windows 服务管理器中查看MySQL服务状态 ``` - **测试本地连接**: ```bash mysql -u [用户名] -p[密码] -h 127.0.0.1 -P 3306 ``` 若无法连接,需检查MySQL配置或重新安装服务[^4]。 #### 2. 核对JDBC连接参数 在`application.yml`或`application.properties`中检查以下配置: ```properties spring.datasource.druid.url=jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.druid.username=root spring.datasource.druid.password=123456 spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver ``` - **关键点**: - 密码需为字符串类型(如`password="123456"`而非`password=123456`) - 使用`com.mysql.cj.jdbc.Driver`驱动类(MySQL 8.0+) - 关闭SSL(`useSSL=false`)并指定时区(`serverTimezone=Asia/Shanghai`) #### 3. 验证依赖与驱动版本 - **检查`pom.xml`中的MySQL驱动版本**: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> <!-- 推荐8.0.x版本 --> </dependency> ``` 若版本低于`8.0.x`,需升级驱动[^3]。 #### 4. 检查防火墙与端口 - **开放3306端口**: ```bash # Linux sudo ufw allow 3306/tcp # Windows 在防火墙高级设置中添加入站规则 ``` #### 5. 调整Druid连接池配置 增加超时时间和验证查询: ```properties spring.datasource.druid.validation-query=SELECT 1 spring.datasource.druid.test-on-borrow=true spring.datasource.druid.max-wait=30000 # 等待超时时间(毫秒) ``` --- ### 三、补充验证方法 1. **使用独立JDBC代码测试**: ```java public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test?useSSL=false"; String user = "root"; String password = "123456"; try (Connection conn = DriverManager.getConnection(url, user, password)) { System.out.println("连接成功"); } catch (SQLException e) { e.printStackTrace(); } } ``` 若独立测试失败,需排除框架干扰[^2]。 --- ### 四、常见问题总结 | 现象 | 解决方案 | |---------------------|----------------------------| | 密码错误 | 检查`password`字段引号 | | 驱动类未加载 | 更新`mysql-connector-java` | | 特殊字符未转义 | URL中使用`&`替代`&` | | 数据库用户权限不足 | 执行`GRANT ALL PRIVILEGES` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭建華

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值