MySQL 異常有這一篇就夠了!

摘要:在本文中,總結了開發過程當中最爲常見的幾種 MySQL 拋出的異常以及如何解決,包括高版本驅動的問題、時區配置問題、SSL 鏈接問題等,是一篇經驗總結貼。

前言

在本文中,總結了開發過程當中最爲常見的幾種 MySQL 拋出的異常以及如何解決,包括高版本驅動的問題、時區配置問題、SSL 鏈接問題等,是一篇經驗總結貼,於我我的而言,這一篇足以解決目前項目中全部遇到的 MySQL 問題。同時,也但願本文能對 MySQL 數據庫初學者有必定的引導入門做用。html

報錯以下:java

Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!

對於此類錯誤,直接看釋義,一句話:JDBC 驅動拋出異常,連不上數據庫。mysql

1、代碼配置的數據庫名稱或者密碼與本地數據庫不一致

1.一、錯誤產生描述

第一種,也是最爲常見的一種錯誤:代碼配置的數據庫名稱或者密碼與本地數據庫不一致,拋出異常。sql

如上圖所示,在配置文件中,前面的 name 屬性是默認的,無需改變,對於用戶名,通常爲 root,能夠經過數據庫管理軟件直接查看本地配置的狀況,數據庫的密碼就是你本身設置的了。數據庫

1.二、解決方式

修改配置文件對應的名稱和密碼。服務器

2、導入的非本地項目文件與本地的數據庫版本不匹配

2.一、錯誤產生描述

第二種常見的錯誤:使用 IDE(以 Eclipse 爲例)導入的非本地項目文件與本地的數據庫版本不匹配。app

舉個例子:你導入你 eclipse 中的項目裏面依賴的 jar 包是 8.0 的版本,而你本地安裝的是 5.0 的 MySQL 數據庫,天然報錯。eclipse

2.二、解決方式

在你導入的項目中找到 Referenced Libraries,右擊鼠標→Build Path→Configure Build Path…Remove 掉項目裏面依賴的 8.0 的 MySQL 驅動,Add 進你本地安裝的 5.0 的版本便可。ide

3、MySQL 高版本配置加載驅動類包出錯問題(以 MySQL 8.0 爲例)

這個錯誤是因爲 MySQL 版本更新以後,驅動包發生改變致使的,新的驅動程序類是 com.mysql.cj.jdbc.Driver。測試

3.一、錯誤產生描述

報錯以下:

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.

錯誤說明:不建議使用驅動類’com.mysql.jdbc.Driver’。新的驅動程序類是’com.mysql.cj.jdbc.Driver’,驅動程序是經過 SPI 自動註冊的,一般是不須要手動加載驅動類。

3.二、解決方式

將 MySQL 數據庫 5.0 使用的驅動類com.mysql.jdbc.Driver改成com.mysql.cj.jdbc.Driver,驅動程序是經過 SPI 自動註冊的,一般是不須要手動加載驅動類。修改以後的配置文件以下圖所示:

<!-- 加載數據庫驅動 -->
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>

3.三、MySQL 不一樣版本的驅動類如何查看

對於 MySQL 的驅動類,咱們對每一個版本進行查看時,點開驅動的 jar 包能夠直接查看驅動是位於哪裏,例如 8.0 版本的就是 com.mysql.cj.jdbc.Driver,以下圖所示:

4、數據庫鏈接字符串高版本配置出錯(時區問題)

注意:MySQL 6.0 版本以後都須要配置時區。

4.一、錯誤產生描述

報錯以下:

2020-01-14 00:45:30,876 ERROR [DruidDataSource.java:616] : init datasource error 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.

錯誤說明:服務器時區值「????±××?±?沒法識別或表明一個以上的時區。

4.二、解決方式

咱們能夠利用時區支持,經過配置服務器或 JDBC 驅動程序(經過 serverTimezone 配置屬性)以使用更具體的時區值。

配置文件以下:

<!-- 數據庫鏈接字符串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"></property>

5、爲何數據庫中寫入數據相差 8 個小時?

5.一、錯誤產生描述

Java 數據庫鏈接使用 UTC 時區(世界標準時間),即 serverTimezone=UTC,而北京時間比 UTC 時間早8小時,即 UTC+08:00,若是咱們直接使用 serverTimezone=UTC,寫入數據庫中的數據會提早 8 個小時。若是按照以下配置就會在數據庫中寫入數據相差 8 個小時:

<!-- 數據庫鏈接字符串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&amp;characterEncoding=utf-8"></property>

5.二、解決方式

咱們能夠修改設置 serverTimezone 爲北京時間 GMT%2B八、上海時間 Asia/Shanghai 或者香港時間 Hongkong。

配置文件以下便可:

<!-- 數據庫鏈接字符串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"></property>

另外在 MySQL 中的 my.ini 配置文件也能夠修改,此文章僅用於解決相應問題,故很少作詳細描述。

6、SSL 鏈接問題

6.一、錯誤產生描述

報錯以下:

Sun Oct 14 00:45:30 CST 2018 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 鏈接。對於不使用 SSL 的現有應用程序,服務器的驗證證書屬性設置爲「false」。您須要經過設置useSSL = false來顯式禁用 SSL,或者設置useSSL = true並提供服務器的驗證證書。

6.二、解決方式

  1. 數據庫 URL 鏈接地址添加useSSL = false,適用於測試。
  2. 數據庫 URL 鏈接地址添加useSSL = true,而且提供服務器的驗證證書。

配置文件以下便可:

<!-- 數據庫鏈接字符串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?useSSL=false&amp;serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"></property>

總結

經過對於 MySQL 拋出異常的幾種常看法決方式的總結,加深對於 MySQL 底層的瞭解。只要是幹開發,錯誤是不斷地,要善於總結。同時,要充分掌握開發的底層原理,不一樣的版本迭代做爲開發者要及時瞭解,否則永遠跟不上技術的發展。

本文分享自華爲雲社區《MySQL 異常有這一篇就夠了!MySQL 拋出異常的幾種常看法決方式小結(時區問題、SSL 鏈接問題、8.0 高版本兼容問題)》,原文做者:白鹿第一帥 。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索