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


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

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




2、Transactions Processed



3、CPU Resources

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

