2010-05-30 135 views
5

我正在運行Ubuntu,並最終嘗試使用JDBC將Tomcat連接到我的MySQL數據庫。無法使用JDBC連接到MySQL - 連接超時 - Ubuntu 9.04

它以前的工作但重啓後實例現在無法連接。

  • 兩者的Tomcat 6和MySQL 5.0.75是在同一臺機器
  • 連接字符串上:JDBC:MySQL的:///本地主機:3306
  • 我可以連接到MySQL使用mysql在命令行上命令
  • my.cnf文件是非常標準的(應要求提供)已綁定地址:127.0.0.1
  • 我不能telnet到MySQL端口的netstat雖然說MySQL是聽
  • 我有一個iptables規則轉發80 - > 8080,沒有我知道的防火牆。

我對此很新,我不確定還有什麼要測試。我不知道我是否應該查看etc/interfaces,以及如果我做了什麼尋找。這很奇怪,因爲它曾經工作,但在重新啓動後,它已經關閉了,所以我必須改變一些東西.... :)。

我意識到超時表示服務器沒有響應,我認爲這是因爲請求實際上沒有通過。我通過手動安裝了apt-get和Tomcat來安裝MySQL。

MYSQLD處理

[email protected]:/var/log/mysql# ps -ef | grep mysqld 
root  21753  1 0 May27 ?  00:00:00 /bin/sh /usr/bin/mysqld_safe 
mysql 21792 21753 0 May27 ?  00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock 
root  21793 21753 0 May27 ?  00:00:00 logger -p daemon.err -t mysqld_safe -i -t mysqld 
root  21888 13676 0 11:23 pts/1 00:00:00 grep mysqld 

用netstat

[email protected]:/var/log/mysql# netstat -lnp | grep mysql 
tcp  0  0 0.0.0.0:3306   0.0.0.0:*    LISTEN  21792/mysqld 
unix 2  [ ACC ]  STREAM  LISTENING  1926205077 21792/mysqld  /var/run/mysqld/mysqld.sock 

玩具連接類

[email protected]:~# cat TestConnect/TestConnection.java 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public class TestConnection { 

    public static void main(String args[]) throws Exception { 
    Connection con = null; 

    try { 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     System.out.println("Got driver"); 
     con = DriverManager.getConnection(
       "jdbc:mysql:///localhost:3306", 
       "uname", "pass"); 
     System.out.println("Got connection"); 

     if(!con.isClosed()) 
     System.out.println("Successfully connected to " + 
      "MySQL server using TCP/IP..."); 

    } finally { 
     if(con != null) 
      con.close(); 
    } 
    } 
} 

玩具連接類輸出

注意:這是我從Tomcat獲得的同樣的錯誤。

[email protected]:~/TestConnect# java -cp mysql-connector-java-5.1.12-bin.jar:. TestConnection 
Got driver 
       Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet sent successfully to the server was 1 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:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 
     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)    
     at TestConnection.main(TestConnection.java:14) 
Caused by: 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:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) 
     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122) 
     at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) 
     at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181) 
     ... 12 more 
Caused by: java.net.ConnectException: Connection timed out 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     ... 13 more 

的Telnet輸出

[email protected]:~/TestConnect# telnet localhost 3306 
Trying 127.0.0.1... 
telnet: Unable to connect to remote host: Connection timed out 

回答

2

netstat顯示的是,MySQL確實對所有本地地址偵聽端口3306。由於telnet無法連接到127.0.0.1那裏防火牆會阻止您 - 嘗試運行sudo ufw default allow以有效禁用它或sudo ufw allow 3306並查看是否進行了任何更改。

+0

這導致我的答案是lo接口被關閉。 *恥辱*。快速的'ifconfig lo up'對它進行排序。 – gav 2010-07-04 19:06:16

0

連接字符串應該是

jdbc:mysql://localhost:3306 

代替

jdbc:mysql:///localhost:3306 

而且在Unix/Linux,由默認客戶端/服務器通信是通過unix套接字文件完成的,而不是通過tcp/ip完成的。因此,您無法遠程登錄到本地計算機上的端口3306。

+0

我ammended連接字符串和仍然沒有運氣。是否有可能通過使用Tomcat/Java的套接字進行連接?也許我從來沒有能夠通過這個端口連接和tomcat用於使用套接字? – gav 2010-05-30 16:01:17

+0

似乎MySQL Connector/J不支持通過unix套接字連接 - 它只支持通過tcp/ip或命名管道的連接。一個簡單的選擇是將你的MySQL服務器配置爲通過tcp/ip接受連接。 – 2010-05-31 03:02:03

0

您是否總是對getConnection方法使用相同的簽名,或者是您在停止工作之前更改的某個內容?(中字符串的建議「///」這是最近才加入。)

如果這是新的代碼,你可以嘗試下面的連接字符串:

字符串dbUrl =「的jdbc:mysql的:// localhost:3306/[db]?user = [user] & password = [password]「; Connection conn = DriverManager.getConnection(dbUrl);

這是mysql.com文檔頁面上的示例格式:

http://dev.mysql.com/doc/refman/5.0/es/connector-j-usagenotes-basic.html

1

/etc/hosts文件的外觀如何?你有類似以下的條目嗎?

127.0.0.1 localhost 

你可以嘗試遠程登錄:

telnet 127.0.0.1 3306 or telnet 127.0.0.1:3306 

或JDBC連接:

jdbc:mysql://127.0.0.1:3306