Не удается подключиться к MySQL с помощью JDBC - Тайм-аут соединения - Ubuntu 9.04 - PullRequest
5 голосов
/ 30 мая 2010

Я использую Ubuntu и в конечном итоге пытаюсь подключить Tomcat к моей базе данных MySQL с помощью JDBC.

Ранее он работал , но после перезагрузки экземпляр не может подключиться.

  • Tomcat 6 и MySQL 5.0.75 находятся на одном компьютере
  • Строка подключения: jdbc: mysql: /// localhost: 3306
  • Я могу подключиться к MySQL из командной строки, используя команду mysql
  • Файл my.cnf довольно стандартный (доступен по запросу) и имеет адрес привязки: 127.0.0.1
  • Я не могу подключиться к порту MySQL через Telnet, несмотря на то, что netstat говорит, что MySQL прослушивает
  • У меня есть одно правило IpTables для пересылки 80 -> 8080, и нет брандмауэра, о котором я знаю.

Я довольно новичок в этом, и я не уверен, что еще нужно проверить. Я не знаю, должен ли я искать в etc / interfaces и если я сделал то, что искать. Это странно, потому что раньше работало, но после перезагрузки он отключился, поэтому я, должно быть, что-то изменил ....:).

Я понимаю, что тайм-аут указывает, что сервер не отвечает, и я предполагаю, что это потому, что запрос на самом деле не проходит. Я установил MySQL через apt-get и Tomcat вручную.

MySqld процессов

root@88:/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

root@88:/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

Класс игрушечного соединения

root@88:~# 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.

root@88:~/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

root@88:~/TestConnect# telnet localhost 3306
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection timed out

Ответы [ 4 ]

2 голосов
/ 18 июня 2010

Netstat показывает, что MySQL действительно прослушивает порт 3306 по всем локальным адресам. Поскольку telnet не может подключиться к 127.0.0.1, является брандмауэром, который останавливает вас - попробуйте запустить sudo ufw default allow, чтобы отключить его, или sudo ufw allow 3306 и посмотрите, вносит ли он какие-либо изменения.

1 голос
/ 20 июня 2010

Как выглядит ваш файл / etc / hosts? У вас есть запись, подобная следующей?

127.0.0.1   localhost

Можете ли вы попробовать Telnet:

telnet 127.0.0.1 3306 or telnet 127.0.0.1:3306

или JDBC подключиться к:

jdbc:mysql://127.0.0.1:3306
0 голосов
/ 18 июня 2010

Вы всегда использовали одну и ту же сигнатуру для метода getConnection, или это одна из вещей, которые вы изменили до того, как он перестал работать? («///» в строке указывает на то, что это было последнее добавление.)

Если это новый код, вы можете попробовать следующую строку подключения:

String dbUrl = "jdbc: mysql: // localhost: 3306 / [db]? User = [user] & password = [password]"; Соединение conn = DriverManager.getConnection (dbUrl);

Это пример формата на странице документации mysql.com:

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

0 голосов
/ 30 мая 2010

Строка подключения должна быть

jdbc:mysql://localhost:3306

вместо

jdbc:mysql:///localhost:3306

Также в unix / linux по умолчанию связь клиент / сервер осуществляется через файл сокета unix, а не через tcp / ip Следовательно, вы не можете подключиться к порту 3306 на своем локальном компьютере.

...