1. 程式人生 > >MySQL 異常有這一篇就夠了!

MySQL 異常有這一篇就夠了!

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

前言

在本文中,總結了開發過程中最為常見的幾種 MySQL 丟擲的異常以及如何解決,包括高版本驅動的問題、時區配置問題、SSL 連線問題等,是一篇經驗總結貼,於我個人而言,這一篇足以解決目前專案中所有遇到的 MySQL 問題。同時,也希望本文能對 MySQL 資料庫初學者有一定的引匯入門作用。

報錯如下:

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

對於此類錯誤,直接看釋義,一句話:JDBC 驅動丟擲異常,連不上資料庫。

一、程式碼配置的資料庫名稱或者密碼與本地資料庫不一致

1.1、錯誤產生描述

第一種,也是最為常見的一種錯誤:程式碼配置的資料庫名稱或者密碼與本地資料庫不一致,丟擲異常。

如上圖所示,在配置檔案中,前面的 name 屬性是預設的,無需改變,對於使用者名稱,一般為 root,可以通過資料庫管理軟體直接檢視本地配置的情況,資料庫的密碼就是你自己設定的了。

1.2、解決方式

修改配置檔案對應的名稱和密碼。

二、匯入的非本地專案檔案與本地的資料庫版本不匹配

2.1、錯誤產生描述

第二種常見的錯誤:使用 IDE(以 Eclipse 為例)匯入的非本地專案檔案與本地的資料庫版本不匹配。

舉個例子:你匯入你 eclipse 中的專案裡面依賴的 jar 包是 8.0 的版本,而你本地安裝的是 5.0 的 MySQL 資料庫,自然報錯。

2.2、解決方式

在你匯入的專案中找到 Referenced Libraries,右擊滑鼠→Build Path→Configure Build Path…Remove 掉專案裡面依賴的 8.0 的 MySQL 驅動,Add 進你本地安裝的 5.0 的版本即可。

三、MySQL 高版本配置載入驅動類包出錯問題(以 MySQL 8.0 為例)

這個錯誤是由於 MySQL 版本更新之後,驅動包發生改變導致的,新的驅動程式類是 com.mysql.cj.jdbc.Driver。

3.1、錯誤產生描述

報錯如下:

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.2、解決方式

將 MySQL 資料庫 5.0 使用的驅動類com.mysql.jdbc.Driver改為com.mysql.cj.jdbc.Driver,驅動程式是通過 SPI 自動註冊的,通常是不需要手動載入驅動類。修改之後的配置檔案如下圖所示:

<!-- 載入資料庫驅動 -->
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>

3.3、MySQL 不同版本的驅動類如何檢視

對於 MySQL 的驅動類,我們對每個版本進行檢視時,點開驅動的 jar 包可以直接檢視驅動是位於哪裡,例如 8.0 版本的就是 com.mysql.cj.jdbc.Driver,如下圖所示:

四、資料庫連線字串高版本配置出錯(時區問題)

注意:MySQL 6.0 版本之後都需要配置時區。

4.1、錯誤產生描述

報錯如下:

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.2、解決方式

我們可以利用時區支援,通過配置伺服器或 JDBC 驅動程式(通過 serverTimezone 配置屬性)以使用更具體的時區值。

配置檔案如下:

<!-- 資料庫連線字串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"></property>

五、為什麼資料庫中寫入資料相差 8 個小時?

5.1、錯誤產生描述

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.2、解決方式

我們可以修改設定 serverTimezone 為北京時間 GMT%2B8、上海時間 Asia/Shanghai 或者香港時間 Hongkong。

配置檔案如下即可:

<!-- 資料庫連線字串 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"></property>

另外在 MySQL 中的 my.ini 配置檔案也可以修改,此文章僅用於解決相應問題,故不多做詳細描述。

六、SSL 連線問題

6.1、錯誤產生描述

報錯如下:

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.2、解決方式

  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 高版本相容問題)》,原文作者:白鹿第一帥 。

 

點選關注,第一時間瞭解華為雲新鮮技