MySQL抛出异常的几种常见解决方式小结(含时区问题、SSL连接问题、8.0高版本兼容问题等)

在这里插入图片描述

MySQL抛出异常的几种常见解决方式小结(含时区问题、SSL连接问题、8.0高版本兼容问题等)

Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!几种解决方式小结

在这里插入图片描述
对于此类错误,直接看释义,一句话:JDBC驱动抛出异常,连不上数据库。

第一种:代码配置的数据库名称或者密码与本地数据库不一致,抛出异常。在这里插入图片描述

配置文件中,前面的name属性是默认的,无需改变,对于用户名,一般为root,可以通过数据库管理软件直接查看本地配置的情况,数据库的密码就是你自己设置的了。
解决方式:修改配置文件对应的名称和密码。
在这里插入图片描述

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

举个例子,你导入你eclipse中的项目里面依赖的jar包是8.0的版本,而你本地安装的是5.0的MySql,自然报错。
解决方式:在你导入的项目中找到Referenced Libraries,右击鼠标→Build Path→Configure Build Path…Remove掉项目里面依赖的8.0的MySql驱动,Add进你本地安装的5.0的版本即可。
在这里插入图片描述
在这里插入图片描述

第三种:MySql高版本配置出错问题(以MySql8.0为例)

1、配置加载驱动类包出错问题

报错

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自动注册的,通常是不需要手动加载驱动类。

解决方式:将MySql数据库5.0使用的驱动类com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver,驱动程序是通过SPI自动注册的,通常是不需要手动加载驱动类。
在这里插入图片描述

<!-- 加载数据库驱动 -->
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>

对于后面的驱动类,我们对每个版本进行查看时,点开驱动的jar包可以直接查看驱动是位于哪里,例如8.0版本的就是com.mysql.cj.jdbc.Driver
在这里插入图片描述
在这里插入图片描述

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

MySql6.0版本之上都需要配置时区。

报错

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.

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

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

<!-- 数据库连接字符串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"></property>

3、对于数据库中写入数据相差8个小时的解决方案:

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

<!-- 数据库连接字符串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&amp;characterEncoding=utf-8"></property>

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

<!-- 数据库连接字符串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"></property>

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

4、SSL连接问题

报错

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并提供服务器的验证证书。

解决方式

  1. 数据库URL连接地址添加useSSL = false,适用于测试。
  2. 数据库URL连接地址添加useSSL = true,并且提供服务器的验证证书。
<!-- 数据库连接字符串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?useSSL=false&amp;serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"></property>

在这里插入图片描述

大家如果还有什么问题、建议或者补充可以留言,看到了我会及时回复!一手资讯请关注本人公众号:WDeerCode代码圈哦!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_22695001/article/details/103803256