这篇文章主要讲解了“MySQL驱动mysql-connector-java升级到8.0.X版本问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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 角色、密码强度、授权。
2、下载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性能对比
1、InnoDB Row Operations
2、Transactions Processed
3、CPU Resources