題記:前幾天用JDBC連接MYSQL數據庫的時候,出現了一些BUG,針對於代碼和設置方面進行問題的解決。
一、出現:遠程mysql_java.sql.SQLException: null, message from server: "Host 'xxx' is not allowed to connect
很明顯的意思就是當前數據庫不允許我們進行遠程連接。
遠程的機器B不允許機器A訪問他的數據庫。也就是說,我們要解決這個問題,就是要讓機器B的數據庫允許機器A訪問,就搞定啦;
立刻到cmd窗口中使用 >mysql -uroot -proot -h192.168.1.88 -P3306 -Ddb10來連接服務器會顯示錯誤,說明確實是無法通過遠程連接到數據庫的。
【當初設置的時候沒有保存截圖,這里就沒有放圖了,但是有Err的明星錯誤的】
注意:前提是使用 >mysql -uroot -proot 這條指令是可以連接到數據庫的,不然就是你的環境變量或者是數據庫的安裝有問題了。MYSQL的安裝請點擊。
如下
當進入到這個界面我們就可以進行對應的解決方案了:
- 第一步:輸入 use mysql
- 第二步:輸入 show tables;
再輸入相關指令:
- 第一步:select host from user;
- 第二步:update user set host ='%' where user='root';
- 第三步:select host form user; [檢查一下是否更新成功]
然后進入計算機的服務界面,重新啟動MYSQL的服務就可以了。
再去cmd窗口使用遠程連接,進入mysql目錄就可以成功了。
小結:當時整數據庫的時候全部用了開發工具,也沒有注意到該數據庫是否允許遠程連接的,一直都是進行本地連接,
直到后面使用JDBC來連接數據庫進行操作的時候才發現這個原因
二、Exception in thread "main" java.lang.UnsupportedClassVersionError: com/mysql/jdbc/Driver : Unsupported major.minor version 52.0
上面這個錯誤是因為導入的用來連接的jar包和我們當前項目的jdk版本是不一樣的,導致版本不一致而出錯了
出現問題原因-----分析 { JDK版本不一致的問題 }
- 在eclipse中開發的項目有個Java build path中可以配置的JDK
- java compiler中可以配置compiler level{eclipse>windows>preferences>java>compiler>compiler compliance level}
區別
- build path的JDK版本是你開發的時候編譯器需要使用到的,就是你在eclipse中開發代碼,給你提示報錯的,編譯的過程;
- java compiler compliance level中配置的編譯版本號,這個編譯版本號的作用是,你這個項目將來開發完畢之后,要放到服務器上運行,那個服務器上JDK的運行版本。
問題就是,build path中配置1.7的JDK,java compiler compliance level中配置的1.7,但是程序運行需要的是1.8的JDK,就報了那個錯誤。
在eclipse中進行開發的時候,build path 中JDK進行類庫的編譯(就是你使用類在不在這個JDK中),
java compiler compliance level是對這個項目語法的編譯(就是你的項目中語法的正確與否),在開發的過程中,這兩個地方是都起作用的。
總結:build path 和 java complier compliance level和服務器配置的JDK保持一致,就不會出現任何問題的。
這個問題的解決方法也是很簡單的,首先去查看自己的導入的jar包是在哪個jdk版本下面運行的,然后再更改我們項目的jdk版本號,或者是換用和我們一樣版本號的jar包就可以解決了,
這里我導入的是在jdk8上運行的jar包,所以我將我的項目改為jdk8的,
查看我的項目目前的版本是:1.7的
第一步、
第二步、
第三步、
這個時候再查看我們的項目JDK版本是1.8的了。
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.Drive的換為com.mysql.cj.jdbc.Driver即可,這是由於我當前使用的是最新的jdbc驅動包,里面的API有跟新了
4、當我把API換為新的了,但是運行的時候又出錯了,這回的錯是:
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.
仔細閱讀,發現是與時間設置相關,仔細研究后發現,是因為新版的Mysql中的時區默認設置與本地時區之間是不同的,因此會報錯。
解決方法即為修改時區設置即可,可以在連接數據庫的url的最后添加這樣一段代碼 ?serverTimezone=UTC
,就可以解決問題了。
事例:
原來報錯的:String url = "jdbc:mysql://176.129.8.53:3306/db10";
改正后的:String url = "jdbc:mysql://176.129.8.53:3306/db10?serverTimezone=UTC";
總結:
這是對使用MYSQL的JDBC驅動包進行數據庫的操作的時候總結出來的一些解決方案,
然后分享出來自己當時的一步一步的解決步驟,肯定是不全的,但是就目前而言是可以解決一大部分的錯誤的了。
2019-03-09 13:46:08