MySQL和MySQL驅(qū)動(dòng)mysql-connector-java升級(jí)到8.0.X版本問(wèn)題
一、MySQL升級(jí)到8.0.X版本
1、升級(jí)的原因及MySQL8.0版本新特性
比MySQL 5.7快2倍,僅這一個(gè)理由就夠了,而且還有其他許多很好的新特性:
1. 性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面帶來(lái)了更好的性能:讀/寫(xiě)工作負(fù)載、IO 密集型工作負(fù)載、以及高競(jìng)爭(zhēng)("hot spot"熱點(diǎn)競(jìng)爭(zhēng)問(wèn)題)工作負(fù)載。
2. NoSQL:MySQL 從 5.7 版本開(kāi)始提供 NoSQL 存儲(chǔ)功能,目前在 8.0 版本中這部分功能也得到了更大的改進(jìn)。該項(xiàng)功能消除了對(duì)獨(dú)立的 NoSQL 文檔數(shù)據(jù)庫(kù)的需求,而 MySQL 文檔存儲(chǔ)也為 schema-less 模式的 JSON 文檔提供了多文檔事務(wù)支持和完整的 ACID 合規(guī)性。
3. 窗口函數(shù)(Window Functions):從 MySQL 8.0 開(kāi)始,新增了一個(gè)叫窗口函數(shù)的概念,它可以用來(lái)實(shí)現(xiàn)若干新的查詢方式。窗口函數(shù)與 SUM()、COUNT() 這種集合函數(shù)類(lèi)似,但它不會(huì)將多行查詢結(jié)果合并為一行,而是將結(jié)果放回多行當(dāng)中。即窗口函數(shù)不需要 GROUP BY。
4. 隱藏索引:在 MySQL 8.0 中,索引可以被“隱藏”和“顯示”。當(dāng)對(duì)索引進(jìn)行隱藏時(shí),它不會(huì)被查詢優(yōu)化器所使用。我們可以使用這個(gè)特性用于性能調(diào)試,例如我們先隱藏一個(gè)索引,然后觀察其對(duì)數(shù)據(jù)庫(kù)的影響。如果數(shù)據(jù)庫(kù)性能有所下降,說(shuō)明這個(gè)索引是有用的,然后將其“恢復(fù)顯示”即可;如果數(shù)據(jù)庫(kù)性能看不出變化,說(shuō)明這個(gè)索引是多余的,可以考慮刪掉。
5. 降序索引:MySQL 8.0 為索引提供按降序方式進(jìn)行排序的支持,在這種索引中的值也會(huì)按降序的方式進(jìn)行排序。
6. 通用表表達(dá)式(Common Table Expressions CTE):在復(fù)雜的查詢中使用嵌入式表時(shí),使用 CTE 使得查詢語(yǔ)句更清晰。
7. UTF-8 編碼:從 MySQL 8 開(kāi)始,使用 utf8mb4 作為 MySQL 的默認(rèn)字符集。
8. JSON:MySQL 8 大幅改進(jìn)了對(duì) JSON 的支持,添加了基于路徑查詢參數(shù)從 JSON 字段中抽取數(shù)據(jù)的 JSON_EXTRACT() 函數(shù),以及用于將數(shù)據(jù)分別組合到 JSON 數(shù)組和對(duì)象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函數(shù)。
9. 可靠性:InnoDB 現(xiàn)在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以實(shí)現(xiàn)事務(wù)完整性了,要么失敗回滾,要么成功提交,不至于出現(xiàn) DDL 時(shí)部分成功的問(wèn)題,此外還支持 crash-safe 特性,元數(shù)據(jù)存儲(chǔ)在單個(gè)事務(wù)數(shù)據(jù)字典中。
10. 高可用性(High Availability):InnoDB 集群為您的數(shù)據(jù)庫(kù)提供集成的原生 HA 解決方案。
11. 安全性:對(duì) OpenSSL 的改進(jìn)、新的默認(rèn)身份驗(yàn)證、SQL 角色、密碼強(qiáng)度、授權(quán)。
詳細(xì)更新說(shuō)明:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-11.html
官方發(fā)布說(shuō)明: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
官網(wǎng):https://dev.mysql.com/downloads/mysql/
到官網(wǎng),下載MySQL Community Server,這個(gè)是日常使用版本,選擇要安裝的操作系統(tǒng),下載對(duì)應(yīng)的安裝包,下載最新的穩(wěn)定版本即可。


3、備份數(shù)據(jù)
保留數(shù)據(jù)SQL腳本,沒(méi)有的話導(dǎo)出,可以使用Navicat等工具進(jìn)行備份。
4、卸載原版本MySQL
直接按照普通軟件卸載的方式卸載即可。
5、安裝下載的新版本
8.0和以前比較安裝步驟簡(jiǎn)單了許多,一步一步安裝即可。
6、MySQL升級(jí)后的兼容性問(wèn)題
兼容性還是可以的,目前為止筆者還沒(méi)遇到有兼容問(wèn)題。
雖然網(wǎng)上說(shuō)會(huì)有一點(diǎn)兼容問(wèn)題,但是還是應(yīng)該升級(jí),不能因噎廢食,利益明顯大于弊端。當(dāng)然也要考慮實(shí)際情況,最好不要在版本忙碌期間進(jìn)行,可以選擇一個(gè)不是很忙的版本,最為一個(gè)事項(xiàng)來(lái)做升級(jí),然后進(jìn)行充分驗(yàn)證和修改,保證升級(jí)后的功能正常。
二、升級(jí)MySQL驅(qū)動(dòng)mysql-connector-java升級(jí)到8.0.X版本
1、為什么要升級(jí)驅(qū)動(dòng)版本
筆者原來(lái)安裝MySQL后,驅(qū)動(dòng)沒(méi)升級(jí),使用的mysql-connector-java 5.1.47,驗(yàn)證功能也沒(méi)問(wèn)題,能夠連接數(shù)據(jù)庫(kù)。
但是一定要升級(jí),升級(jí)后使用新的驅(qū)動(dòng)類(lèi),無(wú)論是啟動(dòng)加載速度還是數(shù)據(jù)庫(kù)查詢速度性能都有明顯提升。
筆者本地弄了個(gè)實(shí)例,對(duì)比了下,雖然數(shù)據(jù)量小,差距不明顯,但是還是明顯看到性能提升:

2、升級(jí)版本
直接下載最新版本jar包或,修改引用的版本號(hào)??梢缘絤aven的一些搜索網(wǎng)站(如https://mvnrepository.com/)進(jìn)行搜索可用版本。
<!-- 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、驅(qū)動(dòng)類(lèi)變了,原來(lái)是由原來(lái)的com.mysql.jdbc.Driver改為com.mysql.cj.jdbc.Driver
不修改會(huì)影響性能,啟動(dòng)過(guò)程中有告警:
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.
修改后的驅(qū)動(dòng)程序通過(guò)SPI自動(dòng)注冊(cè),通常不需要手動(dòng)加載驅(qū)動(dòng)程序類(lèi)。
2、jdbc_url上的時(shí)區(qū)變?yōu)楸仨毰渲?,否則會(huì)啟動(dòng)報(bào)錯(cuò)
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升級(jí)到8.0之后的一些兼容問(wèn)題
基本還是兼容的,但是有一些不兼容的地方,目前已經(jīng)筆者知道的有2點(diǎn):
1、如果數(shù)據(jù)庫(kù)表自增主鍵id是bigint類(lèi)型,原來(lái)版本執(zhí)行后返回的id是Long類(lèi)型,現(xiàn)在改為了BigInteger類(lèi)型,如果是使用mybatis基本沒(méi)問(wèn)題;如果是自定義的JDBC框架就要格外注意看處理是否有問(wèn)題,類(lèi)型是否存在不匹配導(dǎo)致問(wèn)題。
2、日期類(lèi)型的字段處理可能存在問(wèn)題,如表中字段為T(mén)IMESTAMP,之前查詢返回能夠返回毫秒值,升級(jí)后不再返回。如果在查詢時(shí)有使用日期轉(zhuǎn)換函數(shù)轉(zhuǎn)換為String,并且對(duì)毫秒值進(jìn)行了處理,那么升級(jí)后會(huì)報(bào)錯(cuò),需要去掉對(duì)毫秒值得處理。如果查詢返回直接映射為Date就沒(méi)問(wèn)題。
三、MySQL8.0和5.7性能對(duì)比
有一份做的很好的性能對(duì)比資料,筆者這里就不做重復(fù)工作了,參考這個(gè)資料可以看出性能提升是實(shí)實(shí)在在的。
資料地址:https://severalnines.com/blog/mysql-performance-benchmarking-mysql-57-vs-mysql-80
轉(zhuǎn)載自上面資料的性能對(duì)比圖:
1、InnoDB Row Operations




2、Transactions Processed



3、CPU Resources

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL預(yù)編譯語(yǔ)句過(guò)多告警排查及解決方案
在使用Spring Cloud Alibaba搭建的微服務(wù)架構(gòu)中,項(xiàng)目采用ShardingSphere進(jìn)行分庫(kù)分表,MyBatis-Plus作為持久層,線上環(huán)境突發(fā)大量預(yù)編譯語(yǔ)句過(guò)多的數(shù)據(jù)庫(kù)告警,導(dǎo)致系統(tǒng)性能下降,所以本文給大家介紹了MySQL預(yù)編譯語(yǔ)句過(guò)多告警排查及解決方案,需要的朋友可以參考下2025-01-01
MySQL存儲(chǔ)函數(shù)以及觸發(fā)器詳解
這篇文章詳細(xì)給大家介紹了MySQL-SQL存儲(chǔ)函數(shù)以及觸發(fā)器,文中有詳細(xì)的代碼示例,對(duì)我們學(xué)習(xí)MySQL有一定的幫助,感興趣的朋友可以參考閱讀下2023-06-06

