首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL 异常有这一篇就够了!

前言

在本文中,总结了开发过程中最为常见的几种 MySQL 抛出的异常以及如何解决,包括高版本驱动的问题、时区配置问题、SSL 连接问题等,是一篇经验总结贴,于我个人而言,这一篇足以解决目前项目中所有遇到的 MySQL 问题。同时,也希望本文能对 MySQL 数据库初学者有一定的引导入门作用。

报错如下:

代码语言:javascript
复制
Could?not?open?JDBC?Connection?for?transaction;?nested?exception?is?java.sql.SQLException:?Connections?could?not?be?acquired?from?the?underlying?database!???

对于此类错误,直接看释义,一句话:JDBC 驱动抛出异常,连不上数据库。

一、代码配置的数据库名称或者密码与本地数据库不一致

1.1、错误产生描述

第一种,也是最为常见的一种错误:?代码配置的数据库名称或者密码与本地数据库不一致,抛出异常。

如上图所示,在配置文件中,前面的 name 属性是默认的,无需改变,对于用户名,一般为 root,可以通过数据库管理软件直接查看本地配置的情况,数据库的密码就是你自己设置的了。

1.2、解决方式

修改配置文件对应的名称和密码。

二、导入的非本地项目文件与本地的数据库版本不匹配

2.1、错误产生描述

第二种常见的错误:使用 IDE(以 Eclipse 为例)导入的非本地项目文件与本地的数据库版本不匹配。

举个例子:你导入你 eclipse 中的项目里面依赖的 jar 包是 8.0 的版本,而你本地安装的是 5.0 的 MySQL 数据库,自然报错。

2.2、解决方式

在你导入的项目中找到 Referenced Libraries,右击鼠标→Build Path→Configure Build Path…Remove 掉项目里面依赖的 8.0 的 MySQL 驱动,Add 进你本地安装的 5.0 的版本即可。

三、MySQL 高版本配置加载驱动类包出错问题(以 MySQL 8.0 为例)

这个错误是由于 MySQL 版本更新之后,驱动包发生改变导致的,新的驱动程序类是 com.mysql.cj.jdbc.Driver。

3.1、错误产生描述

报错如下:

代码语言:javascript
复制
Loading?class?com.mysql.jdbc.Driver'.?This?is?deprecated.?The?new?driver?class?is?com.mysql.cj.jdbc.Driver'.?The?driver?is?automatically?registered?via?the?SPI?and?manual?loading?of?the?driver?class?is?generally?unnecessary.?

错误说明:不建议使用驱动类’com.mysql.jdbc.Driver’。新的驱动程序类是’com.mysql.cj.jdbc.Driver’,驱动程序是通过 SPI 自动注册的,通常是不需要手动加载驱动类。

3.2、解决方式

将 MySQL 数据库 5.0 使用的驱动类com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver,驱动程序是通过 SPI 自动注册的,通常是不需要手动加载驱动类。修改之后的配置文件如下图所示:

代码语言:javascript
复制
<!--?加载数据库驱动?-->?<property?name="driverClass"?value="com.mysql.cj.jdbc.Driver"></property>?

3.3、MySQL 不同版本的驱动类如何查看

对于 MySQL 的驱动类,我们对每个版本进行查看时,点开驱动的 jar 包可以直接查看驱动是位于哪里,例如 8.0 版本的就是 com.mysql.cj.jdbc.Driver,如下图所示:

四、数据库连接字符串高版本配置出错(时区问题)

注意:MySQL 6.0 版本之后都需要配置时区。

4.1、错误产生描述

报错如下:

代码语言:javascript
复制
2020-01-14?00:45:30,876?ERROR?[DruidDataSource.java:616]?:?init?datasource?error?java.sql.SQLException:?The?server?time?zone?value?'???ú±ê×??±??'?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.?

错误说明:服务器时区值“????±××?±?无法识别或代表一个以上的时区。

4.2、解决方式

我们可以利用时区支持,通过配置服务器或 JDBC 驱动程序(通过 serverTimezone 配置属性)以使用更具体的时区值。

配置文件如下:

代码语言:javascript
复制
<!--?数据库连接字符串?-->?<property?name="jdbcUrl"?value="jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&characterEncoding=utf-8"></property>?

五、为什么数据库中写入数据相差 8 个小时?

5.1、错误产生描述

Java 数据库连接使用 UTC 时区(世界标准时间),即 serverTimezone=UTC,而北京时间比 UTC 时间早8小时,即 UTC+08:00,如果我们直接使用 serverTimezone=UTC,写入数据库中的数据会提前 8 个小时。如果按照如下配置就会在数据库中写入数据相差 8 个小时:

代码语言:javascript
复制
<!--?数据库连接字符串?-->?<property?name="jdbcUrl"?value="jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&characterEncoding=utf-8"></property>?

5.2、解决方式

我们可以修改设置 serverTimezone 为北京时间 GMT%2B8、上海时间 Asia/Shanghai 或者香港时间 Hongkong。

配置文件如下即可:

代码语言:javascript
复制
<!--?数据库连接字符串?-->?<property?name="jdbcUrl"?value="jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&characterEncoding=utf-8"></property>?

另外在 MySQL 中的 my.ini 配置文件也可以修改,此文章仅用于解决相应问题,故不多做详细描述。

六、SSL 连接问题

6.1、错误产生描述

报错如下:

代码语言:javascript
复制
Sun?Oct?14?00:45:30?CST?2018?WARN:?Establishing?SSL?connection?without?server's?identity?verification?is?not?recommended.?According?to?MySQL?5.5.45+,?5.6.26+?and?5.7.6+?requirements?SSL?connection?must?be?established?by?default?if?explicit?option?isn't?set.?For?compliance?with?existing?applications?not?using?SSL?the?verifyServerCertificate?property?is?set?to?'false'.?You?need?either?to?explicitly?disable?SSL?by?setting?useSSL=false,?or?set?useSSL=true?and?provide?truststore?for?server?certificate?verification.?

错误说明:不建议在没有服务器身份验证的情况下建立 SSL 连接。根据 MySQL 5.5.45+,5.6.26+ 和 5.7.6+ 的 SSL 连接要求,如果未设置连接方式,则默认情况下必须建立 SSL 连接。对于不使用 SSL 的现有应用程序,服务器的验证证书属性设置为“false”。您需要通过设置useSSL = false来显式禁用 SSL,或者设置useSSL = true并提供服务器的验证证书。

6.2、解决方式

  1. 数据库 URL 连接地址添加useSSL = false,适用于测试。
  2. 数据库 URL 连接地址添加useSSL = true,并且提供服务器的验证证书。

配置文件如下即可:

代码语言:javascript
复制
<!--?数据库连接字符串?-->?property?name="jdbcUrl"?value="jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf-8"></property>?

总结

通过对于 MySQL 抛出异常的几种常见解决方式的总结,加深对于 MySQL 底层的了解。只要是干开发,错误是不断地,要善于总结。同时,要充分掌握开发的底层原理,不同的版本迭代作为开发者要及时了解,不然永远跟不上技术的发展。

  • 发表于:
  • 原文链接http://news.51cto.com/art/202103/648133.htm
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com