Mysql

無法通過 JDBC 連接到 Mysql,但可以正常使用 Mysql

  • July 23, 2021

我有一個本地執行的 mysql 伺服器,我可以使用它來連接

mysql -h localhost -u root

它不需要密碼。但是當我嘗試通過 JDBC 連接相同的屬性(jdbcurl = "jdbc:mysql://localhost:3306/mysql", user = root)時,我得到了這個奇怪的異常

he last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
   at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
   at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
   at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
   at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
   at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
   at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
   at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
   at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
   at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91)
   at com.mysql.cj.NativeSession.connect(NativeSession.java:144)
   at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956)
   at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
   ... 33 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
   at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
   at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
   at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
   at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
   at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
   at java.base/java.net.Socket.connect(Socket.java:591)
   at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
   at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
   ... 36 more

這裡可能是什麼問題?

編輯

嘗試了評論中給出的建議,嘗試通過mysql在 java 中完成連接到 mysql 數據庫。

mysql -h localhost -u root mysql

這有效,我連接到 mysql 數據庫。

情況 1 - JDBC 連接為root@127.0.0.1但未授予特權:

您的mysqlCLI 可能正在通過 Unix 域套接字 (as root@localhost) 進行連接,而您的 Java 應用程序嘗試通過 TCP (as root@127.0.0.1) 進行連接,但未授予權限。

要驗證,status請在 mysql 客戶端中執行命令:

mysql -h localhost -u root -e 'status'

如果Connection您正在連接到Localhost via UNIX socket127.0.0.1 via TCP/IP

如果您通過 UNIX 套接字連接,您可以嘗試強制客戶端使用 TCP:

mysql -h localhost -u root --protocol TCP -e 'status'

如果失敗,您可以檢查主機是否允許該使用者127.0.0.1

SELECT * FROM mysql.user WHERE Host = '127.0.0.1'\G

空結果集表示您還沒有該使用者root@127.0.0.1。您可以使用以下方法創建它:

CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '';
GRANT ALL ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;

然後您可以重試 TCP 和 Java 應用程序。

案例 2 -localhost轉換為 IPv6

如果您如上所述通過 TCP 連接沒有問題,那麼另一種可能性是localhost您的 Java 應用程序將字元串轉換為 IPv6 ::1,而您的 MySQL 伺服器未配置為偵聽 IPv6 介面。

您可以嘗試127.0.0.1在您的中使用jdbcurl,例如:jdbc:mysql://127.0.0.1:3306/mysql.

如果由於某些原因您無法更改jdbcurl,您可以嘗試使用該-Djava.net.preferIPv4Stack=true選項啟動您的 Java 應用程序,例如:

java -Djava.net.preferIPv4Stack=true -jar myapp.jar

您正在使用哪個 MySQL 版本?

我猜你將無法使用root使用者。

創建新的應用程序使用者並將該使用者用於應用程序。

CREATE USER appuser@'%' identified by 'PASSWORD';
Grant SELECT on *.* to appuser@'%';
flush privileges;

引用自:https://dba.stackexchange.com/questions/265737