無法通過 JDBC 連接到 Mysql,但可以正常使用 Mysql
我有一個本地執行的 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
但未授予特權:您的
mysql
CLI 可能正在通過 Unix 域套接字 (asroot@localhost
) 進行連接,而您的 Java 應用程序嘗試通過 TCP (asroot@127.0.0.1
) 進行連接,但未授予權限。要驗證,
status
請在 mysql 客戶端中執行命令:mysql -h localhost -u root -e 'status'
如果
Connection
您正在連接到Localhost via UNIX socket
或127.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;