gpt4 book ai didi

MySQLJDBC驱动版本与数据库版本的对应关系及注意事项

转载 作者:我是一只小鸟 更新时间:2022-11-24 14:31:12 25 4
gpt4 key购买 nike

MySQL JDBC驱动版本与数据库版本的对应关系及注意事项

事情发生

学了三遍的servlet,经典老师又教的第一万遍登陆注册,并且让实现,并且让演示,我们老师可能和之前的小学期公司老师 完全没有沟通过,我们小学期大作业都做了一个小项目出来还搁这登陆注册。 就把五个月前写的一个小项目拿出来,是一个类似菜鸟教程的网站,不过只有java的教程,这都是后话, 。

项目地址为: https://gitee.com/zxeao/Study_Station.git 大佬有兴趣可以看看 。

里面有登录注册,就想着跑一下,给老师演示演示得了,问题出现了,因为之前的服务器过期了,我把数据库环境搭在自己的电脑上,跑起来之后,后台报错,前端登录也是500错误,这就奇了怪了.

错误缘由

前端报错如下: 这谁受得了,自己亲生的项目在自己手里跑不起来,于是研究了一下报错, 。

                        
                          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.
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
	at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
	at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
	at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
	at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
	at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
	at utils.DBHelper.getConnection(DBHelper.java:27)
	at DAO.UserDao.queryLogin(UserDao.java:22)
	at Controller.loginController.doPost(loginController.java:29)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)

                        
                      

发现问题的根源就在DBHelper包,数据库没有链接上,我在idea还是在navicat上都能连接上,正当我百思不得其解,突然想到老师讲过,mysql对应的jdbc驱动版本的问题。 查阅相关资料之后,得知是由于jdbc驱动包引发的问题,我之前服务器上的MySQL版本是8+版本,我查看了现在本机的MySQL版本 果然,版本不一致,我之前在maven里面配置的也是8.0.15的驱动版本,正想着去找5+数据库的驱动版本,打开我的pom一看, 这不就有么?之前做的准备足了现在就不用坐牢了.

解决方法

于是把MySQL驱动的版本换成5.1.38, 更新之后,正当我满心欢喜的等待跑起来,正常登录一下的时候,问题又出现了 。

                        
                          java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1291)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:375)
	at utils.DBHelper.getConnection(DBHelper.java:24)
	at DAO.UserDao.queryLogin(UserDao.java:22)
	at Controller.loginController.doPost(loginController.java:29)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)


                        
                      

不是,现在版本也对应上了,为什么还会报错,跑不起来呢? 问题就在 。

com.mysql.cj.jdbc.Driver 。

大家肯定还见过 。

com.mysql.jdbc.Driver 。

这俩区别在哪,大家看我最下面的 注意事项 .

就是这俩的问题,当我把cj去掉之后,就跑起来了 只能说确实好看.

版本对应

所以我简单做了个整理,把驱动版本和MySQL数据库版本做个可用性对应.

mysql-connector-java MySQL JDK 补充
8.0.x 5.6、5.7、8.0 4.2 JDK 8.0或更高版本 全面上市。推荐版本。
5.1.x 5.6、5.7、8.0 3.0、4.0、4.1、4.2 JDK 5.0和JDK 8.0或更高版本 一般可用性

注意事项

jar包名称

MySQL数据库8.x版本的驱动文件jar包对应的是:

Class.forName("com.mysql.cj.jdbc.Driver"),

语句来加载数据库驱动 。

而我使用的是5.0x版本的数据库驱动文件,对此,需要将加载数据库驱动的语句更改为:

Class.forName("com.mysql.jdbc.Driver"),

此外,url的设置也得进行修改,原本的url如下:

String ur="jdbc:mysql://127.0.0.1:3306/study_station",

应修改为如下:

String url="jdbc:mysql://127.0.0.1:3306/study_station?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8",

关于useSSL的选项

8.0x是不需要建立ssl连接的,你需要显示关闭,即url中的&useSSL=false; 。

5.0x可以建立ssl连接,如果没有加useSSL选项,就会报错 。

                        
                          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的现有应用程序,verifyServerCertificate属性设置为“false”。
您需要通过设置useSSL = false显式禁用SSL,
或者设置useSSL = true并为服务器证书验证提供信任库。

                        
                      

所以5.0x无论使用不使用ssl都要显式的把设置加上,不然就会报错.

关于时区:serverTimezone

serverTimezone=GMT%2B8"是进行时区的设置 使用mysql 8.0.16 版本的驱动的时候解决如下报错:

                        
                          java.sql.SQLException: The server time zone value '???ú±ê×??±??' is unrecognized or represents more than one time zone.

                        
                      

这是由于数据库和系统时区差异所造成的,在jdbc连接的url后面加上serverTimezone=GMT即可解决问题,如果需要使用gmt+8时区,需要写成GMT%2B8,否则会被解析为空.

再一个解决办法就是使用低版本的MySQL jdbc驱动,5.1.28不会存在时区的问题.

url基本格式如下:

连接地址+ssl连接关闭+字符集为utf-8+时区设置 。

顺便一提

如果输入中文存在乱码,可以如下设置

jdbc:mysql://127.0.0.1:3306/hello?useUnicode=true&characterEncoding=UTF-8 。

当然,为了时间什么的稳妥,你也可以都写上 如下:

jdbc:mysql://127.0.0.1:3306/hello?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC 。

搞定.

最后此篇关于MySQLJDBC驱动版本与数据库版本的对应关系及注意事项的文章就讲到这里了,如果你想了解更多关于MySQLJDBC驱动版本与数据库版本的对应关系及注意事项的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com