连接数据库是一个很容易出错,出错后因为原因众多又难以定位的一个bug.

1. 检查数据库连接配置

1.1. 密码什么的错误吗?

1.2. 确认用户权限

  1. 创建用户时需要这样:
GRANT ALL PRIVILEGES ON *.* TO 'itoffice'@'%' IDENTIFIED BY 'itoffice' WITH GRANT OPTION;
flush privileges;

第一个itoffice表示用户名,%表示所有的电脑都可以连接,也可以设置某个ip地址运行连接(这样安全些),第二个itoffice表示密码[^用户权限]: [^用户权限]
2. 检查是否创建成功 SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; 或者这样检查

1.3. 使用com.mysql.jdbc.Driver

或者简单点说就是你的url咋写的

  • jdbc:mysql://127.0.0.1:3306/ --username hive --password hive
  • jdbc:mysql://127.0.0.1:3306/hive?characterEncoding=utf-8 --username hive --password hive 注意第二种

1.4. 使用com.mysql.cj.jdbc.Driver

貌似还需要指定时区那些,暂略

2. 测试本地连接

简单用一下jdbc测试本地连接1

3. 各版本对应关系

3.1. mysql-connector-java与Mysql对应版本

mysql>select version()可以查看数据库版本.

3.2. mysql-connector-java与Java对应版本

3.3. openSSL

  • 5.x版本
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8

注意useSSL=false必须为false

  • 8.x版本
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=U

4. 排查是否线程超时

4.1. Mysql服务器默认的“wait_timeout”是8小时

mysql﹥ show global variables like 'wait_timeout'; 可以查看到,这意味着如果一个connection空闲超过8个小时,Mysql将自动断开该connection。

4.2. 重置wait_timeout

set global wait_timeout=604800; 
 
set global interactive_timeout=604800;

或者直接修改my.ini(windows下),my.cnf(linux下)

5. 防火墙是否关闭

**默认是关闭的.**但是依然有可能屏蔽3306端口.

  1. 设置防火墙允许3306端口 vi /etc/sysconfig/IPtables

  2. 添加(添加在-A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited之前) -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

  3. 重启防火墙 service iptables restart

6. Mysql默认跟随Ubuntu等使用的验证插件有问题

以至于在root@%的情况下能使用localhost登录,不能使用127.0.0.1登录,并在修改user表至下图后: 造成下面Error 1698Error 1045同框: 最终只能卸载Mysql,重新解决1698的问题.并注意重新设置验证插件后,没有密码,需重新指定密码.

7. 其他

error2003,可以限制只监听3306端口,但是放开所有IP

update-alternatives: 使用 /etc/mysql/my.cnf.fallback 来在自动模式中提供 /etc/mysql/my.cnf (my.cnf)

Footnotes

  1. JDBC数据库连接本地数据库的报错问题:Communications link failure