2015-07-21 144 views
1

在我的主機上我已經安裝了Wamp,並且我可以使用PHP或瀏覽器進行連接。我的客戶端是一臺裝有Linux的虛擬機,我正嘗試連接主機上的數據庫以在其中添加一些條目。無法使用Java從VM連接到VM的mysql數據庫

這裏是我的代碼:

Connection conn = null; 
try { 
    String url = "jdbc:mysql://192.168.1.236:8080/fps"; 
    Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    conn = DriverManager.getConnection(url, "username", "password"); 
    System.out.println("Database connection established"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if (conn != null) { 
     try { 
      conn.close(); 
      System.out.println("Database connection terminated"); 
     } catch (Exception e) {} 
    } 
} 

我必須提到,我想在本地網絡進行連接,並且還我安裝WAMP到端口8080上工作(它可以上面看到)。另一件事是,在虛擬機上,我可以使用瀏覽器訪問數據庫。

上面的代碼生成錯誤:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1038) at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:628) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1014) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2249) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2280) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2079) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:794) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325) at java.sql.DriverManager.getConnection(DriverManager.java:571) at java.sql.DriverManager.getConnection(DriverManager.java:215) at DatabaseConnection.main(DatabaseConnection.java:12) Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost. at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2926) at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:560) ... 16 more

我相信問題可能是從MySQL的客戶端上的設置,在文件/etc/mysql/my.cnf,但我真的不知道如何改變他們,因爲我沒有找到這個特殊情況的例子。我還認爲,當mysql正常使用3306時,將端口更改爲8080可能會導致問題。

所以,問題是,我怎麼能做到這一點?謝謝。

編輯:我也想補充說,端口更改(到8080)是在服務器上的Apache的conf文件中進行的。這個默認是80.所以也許它不應該影響mysql的3306。

+0

問題去掉:8080可能在網絡通信。確保你能ping通主機並確保在8080端口上運行mysql。 – Sridhar

+0

怎麼樣mysql-connector.jar文件?你添加了嗎? – Anptk

+0

我認爲mysql的端口是從3306到3309 – Anptk

回答

2

Another thing is that, on the virtual machine, I can access the database using a browser.

通過這個,你的意思是你可以在虛擬機上的瀏覽器上運行一個位於主機上的網站。這與從遠程PC連接不完全相同。在這種情況下,運行的代碼,即我假設的PHP運行在HOST上,並從PHP連接到MYSQL,所有這些都在ON HOST上。

默認情況下,root帳戶,如果您正在使用的是隻允許連接,如果它正在運行MySQL的同一臺PC上運行。

嘗試創建一個新的MySQL用戶帳戶,確保允許這個新帳戶從VM的IP登錄到MySQL。

例如:

CREATE USER 'Florina'@'192.168.1.%' IDENTIFIED BY 'A-Password'; 
GRANT ALL PRIVILEGES ON Your_Database TO 'Florina'@'192.168.1.%'; 

這應該允許帳戶Florina從你的子網的地址連接到MySQL服務器,因此如果VM每次開機後得到不同的IP地址,它不會不管。

檢查您的Firewall是否允許遠程連接到端口8080也是一個好主意!而3306如果你只是對港口變化感到困惑。

其實你確定你改變MYSQL監聽端口8080,還是你改變阿帕奇爲偵聽端口8080。如果你改變了Apache的,那麼你將進入與:8080瀏覽器的URL。 這並不意味着MySQL是在8080端口上監聽在這種情況下,從您的

String url = "jdbc:mysql://192.168.1.236/fps"; 
+0

它不關於權限或訪問被拒絕。它是關於通信錯誤。 – Sridhar

+0

通過「使用瀏覽器」,我的意思是我可以訪問 http://192.168.1。2368080/phpmyadmin/ – Florina

+0

看到最後一段,我不認爲你改變了MySQL在8080上進行監聽,這是你改變的Apache!如果修復/更改錯誤,然後創建新的MySQL帳戶並相應地更改登錄詳細信息 – RiggsFolly

-1

嘗試使用:Class.forName("com.mysql.jdbc.Driver");

代替:Class.forName("com.mysql.jdbc.Driver").newInstance();

+0

'Class.forName(「com.mysql.jdbc.Driver」)'是OP已經擁有的第一步,移除'newInstance()'不應該改變任何東西。另外,實現JDBC 4的驅動程序甚至不需要'Class.forName'調用。 – Pshemo

+0

我試過了,沒有工作。 – Florina

0

正常的MySQL數據庫是聽3306port而不是8080端口除非ü改變

如果8080端口號是否正確,請嘗試從虛擬機命令行ping IP地址,並檢查你的MySQL服務是否UP。

+0

Ping工作得很好。但是,我檢查是否mysql與mysqladmin -u root -p狀態一起運行,並且出現錯誤: mysqladmin:在'localhost'連接到服務器失敗 錯誤:'無法通過套接字連接到本地MySQL服務器'/ var/run/mysqld/mysqld.sock'(2)' 檢查mysqld是否正在運行,並且套接字'/var/run/mysqld/mysqld.sock'存在! – Florina

+0

是否從VM執行該命令行?如果是的話嘗試使用mysql -h 192.168.1.236 -u root -p來包含主機,並告訴我你得到了什麼 –

+0

正在運行mysql -h 192.168.1.236 -u root -p沒有給出任何輸出,它似乎卡住了。我認爲它會超時 – Florina