MySQL和MySQL驱动mysql-connector-java升级到8.0.X版本问题

 更新时间:2023年02月27日 10:38:07   作者:心动的偏执  
这篇文章主要介绍了MySQL和MySQL驱动mysql-connector-java升级到8.0.X版本问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、MySQL升级到8.0.X版本

1、升级的原因及MySQL8.0版本新特性

比MySQL 5.7快2倍,仅这一个理由就够了,而且还有其他许多很好的新特性:

1. 性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载、IO 密集型工作负载、以及高竞争("hot spot"热点竞争问题)工作负载。

2. NoSQL:MySQL 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部分功能也得到了更大的改进。该项功能消除了对独立的 NoSQL 文档数据库的需求,而 MySQL 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整的 ACID 合规性。

3. 窗口函数(Window Functions):从 MySQL 8.0 开始,新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY。

4. 隐藏索引:在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。

5. 降序索引:MySQL 8.0 为索引提供按降序方式进行排序的支持,在这种索引中的值也会按降序的方式进行排序。

6. 通用表表达式(Common Table Expressions CTE):在复杂的查询中使用嵌入式表时,使用 CTE 使得查询语句更清晰。

7. UTF-8 编码:从 MySQL 8 开始,使用 utf8mb4 作为 MySQL 的默认字符集。

8. JSON:MySQL 8 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。

9. 可靠性:InnoDB 现在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以实现事务完整性了,要么失败回滚,要么成功提交,不至于出现 DDL 时部分成功的问题,此外还支持 crash-safe 特性,元数据存储在单个事务数据字典中。

10. 高可用性(High Availability):InnoDB 集群为您的数据库提供集成的原生 HA 解决方案。

11. 安全性:对 OpenSSL 的改进、新的默认身份验证、SQL 角色、密码强度、授权。

详细更新说明:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-11.html

官方发布说明:https://blogs.oracle.com/mysql/announcing-general-availability-of-mysql-80

MySQL 8 正式版的新增功能:https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/

参考资料:https://www.cnbeta.com/articles/soft/718465.htm

2、下载MySQL

官网:https://dev.mysql.com/downloads/mysql/

到官网,下载MySQL Community Server,这个是日常使用版本,选择要安装的操作系统,下载对应的安装包,下载最新的稳定版本即可。

3、备份数据

保留数据SQL脚本,没有的话导出,可以使用Navicat等工具进行备份。

4、卸载原版本MySQL

直接按照普通软件卸载的方式卸载即可。

5、安装下载的新版本

8.0和以前比较安装步骤简单了许多,一步一步安装即可。

6、MySQL升级后的兼容性问题

兼容性还是可以的,目前为止笔者还没遇到有兼容问题。

虽然网上说会有一点兼容问题,但是还是应该升级,不能因噎废食,利益明显大于弊端。当然也要考虑实际情况,最好不要在版本忙碌期间进行,可以选择一个不是很忙的版本,最为一个事项来做升级,然后进行充分验证和修改,保证升级后的功能正常。

二、升级MySQL驱动mysql-connector-java升级到8.0.X版本

1、为什么要升级驱动版本

笔者原来安装MySQL后,驱动没升级,使用的mysql-connector-java 5.1.47,验证功能也没问题,能够连接数据库。

但是一定要升级,升级后使用新的驱动类,无论是启动加载速度还是数据库查询速度性能都有明显提升。

笔者本地弄了个实例,对比了下,虽然数据量小,差距不明显,但是还是明显看到性能提升:

2、升级版本

直接下载最新版本jar包或,修改引用的版本号。可以到maven的一些搜索网站(如https://mvnrepository.com/)进行搜索可用版本。

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

3、修改配置

1、驱动类变了,原来是由原来的com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver

不修改会影响性能,启动过程中有告警:

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.

修改后的驱动程序通过SPI自动注册,通常不需要手动加载驱动程序类。

2、jdbc_url上的时区变为必须配置,否则会启动报错

Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: 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:mysql://localhost:3306/dbname?characterEncoding=utf-8&useSSL=true&serverTimezone=GMT

4、mysql-connector-java升级到8.0之后的一些兼容问题

基本还是兼容的,但是有一些不兼容的地方,目前已经笔者知道的有2点:

1、如果数据库表自增主键id是bigint类型,原来版本执行后返回的id是Long类型,现在改为了BigInteger类型,如果是使用mybatis基本没问题;如果是自定义的JDBC框架就要格外注意看处理是否有问题,类型是否存在不匹配导致问题。

2、日期类型的字段处理可能存在问题,如表中字段为TIMESTAMP,之前查询返回能够返回毫秒值,升级后不再返回。如果在查询时有使用日期转换函数转换为String,并且对毫秒值进行了处理,那么升级后会报错,需要去掉对毫秒值得处理。如果查询返回直接映射为Date就没问题。

三、MySQL8.0和5.7性能对比

有一份做的很好的性能对比资料,笔者这里就不做重复工作了,参考这个资料可以看出性能提升是实实在在的。

资料地址:https://severalnines.com/blog/mysql-performance-benchmarking-mysql-57-vs-mysql-80

转载自上面资料的性能对比图:

1、InnoDB Row Operations

2、Transactions Processed

3、CPU Resources

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql外键(Foreign Key)介绍和创建外键的方法

    mysql外键(Foreign Key)介绍和创建外键的方法

    这篇文章主要介绍了mysql外键(Foreign Key)命令和添加外键方法,需要的朋友可以参考下
    2014-02-02
  • MySQL实战记录之如何快速定位慢SQL

    MySQL实战记录之如何快速定位慢SQL

    这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL语句,下面这篇文章主要给大家介绍了关于MySQL实战记录之如何快速定位慢SQL的相关资料,需要的朋友可以参考下
    2022-03-03
  • mysql查找字符串函数的使用

    mysql查找字符串函数的使用

    这篇文章主要介绍了mysql查找字符串函数的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 升级到MySQL5.7后开发不得不注意的一些坑

    升级到MySQL5.7后开发不得不注意的一些坑

    这篇文章主要给大家介绍了关于升级到MySQL5.7后开发不得不注意的一些坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 哪些情况会导致 MySQL 索引失效

    哪些情况会导致 MySQL 索引失效

    这篇文章主要介绍了哪些情况会导致MySQL索引失效,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • mysql存储过程之循环语句(WHILE,REPEAT和LOOP)用法分析

    mysql存储过程之循环语句(WHILE,REPEAT和LOOP)用法分析

    这篇文章主要介绍了mysql存储过程之循环语句(WHILE,REPEAT和LOOP)用法,结合实例形式分析了mysql存储过程循环语句WHILE,REPEAT和LOOP的原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-12-12
  • MySQL中建表与常见的类型设计陷阱详解

    MySQL中建表与常见的类型设计陷阱详解

    这篇文章详细讲解了MySQL的建表语句、以及表结构的设计规范和陷阱,并对网络上常见的资料给出的设计方案。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-11-11
  • Mysql数据库中子查询的使用

    Mysql数据库中子查询的使用

    本文给大家分享mysql数据库中子查询的使用,非常不错具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-10-10
  • 一文搞定MySQL binlog/redolog/undolog区别

    一文搞定MySQL binlog/redolog/undolog区别

    这篇文章主要介绍了一文搞定MySQL binlog/redolog/undolog区别,作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括redo log和undo log),本文接下来会详细介绍这三种日志,需要的朋友可以参考下
    2023-04-04
  • 浅谈Mysql主键索引与非主键索引区别

    浅谈Mysql主键索引与非主键索引区别

    本文主要介绍了ysql主键索引与非主键索引区别,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-09-09

最新评论