2015-10-05 109 views
1

我有一個奇怪的問題連接到公共託管的靜態IP mysql服務器。到遠程MySQL DB的JDBC連接失敗;

我可以通過MySQL Workbench成功連接服務器,也可以通過SSH連接到本地遠程服務器。但是,從jdbc連接器連接到MySQL服務器的嘗試(通過NetBeans和通過本地部署的代碼均失敗)。在查看日誌時,考慮到用戶憑證是本地用戶而不是遠程用戶,代碼正試圖與遠程服務器連接。所以用戶存在於遠程,但在嘗試連接時,java會考慮user @ localhost。

造成的:java.sql.SQLException中:如出現確切的錯誤訪問被拒絕的用戶 'user'@'c-24-130-52-20.hsd1.ca.comcast.net '(使用密碼:是) 在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) 〜[MySQL的連接器的Java-5.1.27.jar:NA]在 com.mysql。 jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237) 〜[mysql-connector-java-5.1.27.jar:na] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169) 〜[ mysql-connector-java-5.1.27.jar:na]在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:928) 〜[mysql-connector-java-5.1.27.jar:na] at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java: 1750) 〜[MySQL的連接器的Java-5.1.27.jar:NA]

我的連接字符串是:

JDBC:MySQL的://用戶:密碼@ WXYZ/

有人可以請建議如何提及用戶,使Java認爲它是一個遠程用戶,而不是我的機器上的本地用戶?

+2

我認爲錯誤中的地址表示*您的*機器,而不是它正在嘗試連接的機器。 「用戶」之後的標識符標識誰正嘗試連接。你確定所有遠程機器都可以連接到該服務器嗎? – RealSkeptic

+0

哦,是的,你說得對。一開始我就不明白這一點是愚蠢的。感謝您指出。是的,我確保通過將bindaddress設置爲0.0.0.0,可以從外部對每個人進行遠程訪問。我會編輯這個問題來解決這個簡潔的小問題。謝謝。 – user1242321

+0

但是現在我很好奇如何在連接字符串中提到遠程機器的本地用戶?我認爲用戶默認會被認爲是遠程服務器上的用戶,如[email protected]而不是當前的方式。我的寬帶上沒有靜態IP,因此在遠程服務器上授予本地用戶訪問權限也不起作用。 – user1242321

回答

0

這裏的問題是:

當MySQL工作臺進行連接,連接由於用戶名是userName @ WXYZ,因此可以完全訪問數據庫。但是,當我使用java連接時,它試圖連接的用戶是userName @ JavaServerIP,而不是[email protected]。所以連接嘗試失敗,因爲userName @ JavaServerIP無法訪問。授予這種用戶訪問MySQL服務器上的數據庫解決了我的問題。下面是幫助我解決這個問題的命令:

GRANT ALL PRIVILEGES ON my_database.* TO 'my_user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; 
+0

感謝@Neilos和RealSkeptic指出了這一點。 – user1242321

0

我不知道這是否會解決您的問題,但您使用提供的API連接更好,而不是通過手動構建連接字符串。

這將使它更難犯錯誤(這將是難以診斷),使參數替代簡單:

String username = "testuser"; 
String password = "test123"; 
String url = "jdbc:mysql://ip-address/databaseName"; 
Class.forName ("com.mysql.jdbc.Driver").newInstance(); 
Connection conn = DriverManager.getConnection (url, username, password); 
+0

感謝您的意見。但我正在使用Play框架,並且在內部連接您剛剛提到的方式。提到連接字符串的目的是傳達連接細節。 Netbeans連接嘗試失敗,我認爲這應該是非常標準的方式。令人驚訝的是,Mysql工作臺正在成功連接。所以這在這種情況下不會有太大的幫助。 :-( – user1242321

+1

不需要調用'Class.forName'。自JDBC 4以來就有了自動發現。 – RealSkeptic