2010-05-30 75 views
5

Tôi đang chạy Ubuntu và cuối cùng đang cố gắng kết nối Tomcat với cơ sở dữ liệu MySQL của tôi bằng JDBC.Không thể kết nối với MySQL với JDBC - Thời gian chờ kết nối - Ubuntu 9.04

Nó đã hoạt động trước đây nhưng sau khi khởi động lại phiên bản hiện không kết nối được.

  • Cả Tomcat 6 và MySQL 5.0.75 là trên cùng một máy
  • kết nối chuỗi: jdbc: mysql: /// localhost: 3306
  • tôi có thể kết nối với MySQL trên dòng lệnh bằng cách sử dụng mysql tập lệnh
  • các my.cnf là khá chuẩn (Khả dụng trên yêu cầu) đã ràng buộc địa chỉ: 127.0.0.1
  • tôi không thể Telnet vào cổng MySQL mặc dù netstat nói MySQL đang lắng nghe
  • tôi có một quy tắc iptables để chuyển tiếp 80 -> 8080 và không có tường lửa tôi biết.

Tôi khá mới với điều này và tôi không chắc chắn những gì khác để kiểm tra. Tôi không biết liệu mình có nên tìm kiếm trong các giao diện vv hay không và nếu tôi đã làm gì để tìm kiếm. Thật kỳ lạ vì nó được sử dụng để làm việc nhưng sau khi khởi động lại nó xuống vì vậy tôi phải có thay đổi một cái gì đó .... :).

Tôi nhận ra thời gian chờ cho biết máy chủ không phản hồi và tôi cho rằng đó là do yêu cầu không thực sự được thực hiện. Tôi đã cài đặt MySQL thông qua apt-get và Tomcat theo cách thủ công.

mysqld xử lý

[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 

Toy kết nối Lớp

[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(); 
    } 
    } 
} 

Đầu ra lớp kết nối đồ chơi

Lưu ý: Đây là lỗi tương tự tôi nhận được từ 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 Output

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

Trả lời

2

Netstat cho thấy MySQL là thực sự lắng nghe trên cổng 3306 trên tất cả các địa chỉ địa phương. Vì telnet không thể kết nối với 127.0.0.1, nên tường lửa dừng bạn - hãy thử chạy sudo ufw default allow để vô hiệu hóa nó một cách hiệu quả hoặc sudo ufw allow 3306 và xem liệu nó có thực hiện bất kỳ thay đổi nào không.

+0

Điều này dẫn tôi đến câu trả lời đó là giao diện lo bị hỏng. * Treo đầu xấu hổ *. Một 'ifconfig lo up' nhanh chóng sắp xếp nó. – gav

0

Chuỗi kết nối nên được

jdbc:mysql://localhost:3306 

thay vì

jdbc:mysql:///localhost:3306 

Cũng trên unix/linux, bởi mặc định giao tiếp client/server được thực hiện thông qua file unix socket và không qua tcp/ip. Do đó bạn không thể telnet đến cổng 3306 trên máy cục bộ của bạn.

+0

tôi ammended chuỗi kết nối và vẫn không có may mắn. Có thể kết nối thông qua một socket bằng Tomcat/Java không? Có lẽ tôi chưa bao giờ có thể kết nối thông qua cổng này và tomcat được sử dụng để sử dụng các ổ cắm? – gav

+0

Dường như kết nối MySQL/J không hỗ trợ kết nối qua socket unix - nó chỉ hỗ trợ các kết nối qua tcp/ip hoặc các đường ống có tên. Một tùy chọn đơn giản sẽ là cấu hình máy chủ MySQL của bạn để chấp nhận các kết nối thông qua tcp/ip. –

0

Bạn luôn sử dụng cùng một chữ ký cho phương thức getConnection hay là một trong những điều bạn đã thay đổi trước khi nó ngừng hoạt động?(Các '///' trong những gợi ý chuỗi đó là một bổ sung gần đây.)

Nếu đây là mã mới, bạn có thể thử các chuỗi kết nối sau:

Chuỗi dbUrl = "jdbc: mysql: // localhost: 3306/[db]? user = [user] & mật khẩu = [mật khẩu] "; Kết nối conn = DriverManager.getConnection (dbUrl);

Đây là định dạng ví dụ trên trang tài liệu mysql.com:

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

1

Tệp/etc/hosts của bạn trông như thế nào? Bạn có một mục như sau?

127.0.0.1 localhost 

Bạn có thể thử để telnet:

telnet 127.0.0.1 3306 or telnet 127.0.0.1:3306 

hoặc JDBC kết nối với:

jdbc:mysql://127.0.0.1:3306 
Các vấn đề liên quan