как предотвратить java.net.ConnectException: время ожидания соединения истекло?

может ли любой орган объяснить java.net.ConnectException: время ожидания соединения истекло

Caused by: java.net.ConnectException: Connection timed out 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:337) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:198) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) 
    at java.net.Socket.connect(Socket.java:579) 
    at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:289) 
    at net.sourceforge.jtds.jdbc.SharedSocket.(SharedSocket.java:250) 
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:297)

person sivaram    schedule 08.01.2013    source источник
comment
Это ошибка подключения к базе данных. Можете ли вы сделать Telnet для вашего сервера базы данных и порта?   -  person Arun P Johny    schedule 08.01.2013
comment
да, я пытаюсь получить доступ к удаленной системе. Итак, у меня истекло время подключения, вы можете дать мне решение для меня?   -  person sivaram    schedule 08.01.2013
comment
Можно попробовать пинговать сервер? Другая проблема может заключаться в том, что SQL-сервер требует, чтобы вы вручную включили протокол TCP / IP, если вы хотите подключиться из сетевых систем.   -  person Arun P Johny    schedule 08.01.2013


Ответы (3)


Если вы можете проверить связь с сервером sql, то это может быть проблема с конфигурацией TCP / IP в экземпляре сервера sql.

Вы можете обратиться к этого вопроса о том, как для включения TCP / IP также обратитесь к this и this от Microsoft.

  1. Запустите диспетчер конфигурации SQL Server. Щелкните Пуск, выберите Все программы и щелкните Microsoft SQL Server. Щелкните Инструменты настройки, а затем щелкните Диспетчер конфигурации SQL Server.
  2. В диспетчере конфигурации SQL Server на панели консоли разверните Сетевая конфигурация SQL Server.
  3. На панели консоли щелкните Протоколы для.
  4. В области сведений щелкните правой кнопкой мыши TCP / IP и выберите команду Включить.
  5. На панели консоли щелкните Службы SQL Server.
  6. В области сведений щелкните правой кнопкой мыши SQL Server (), а затем выберите «Перезапустить», чтобы остановить и перезапустить службу SQL Server.
person Arun P Johny    schedule 08.01.2013

Это означает, что драйвер попытался открыть соединение с этим IP-адресом на этом порту, но никто не слушал этот порт, поэтому никто не ответил, отсюда и сообщение «Время ожидания соединения истекло».

Как предложил Арун П. Джонни, если вы откроете командную строку и запустите

telnet localhost 4545

и он отвечает вот так

Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

это означает, что никто не слушает. Например. Попытка открыть сокет (соединение с базой данных) на этом порту приведет к исключению тайм-аута соединения. (Порт 4545 был выбран, потому что на моем компьютере ничего не слушает)

Если он отвечает чем-нибудь еще, например

telnet localhost 3306

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Это означает, что порт открыт и исключение не будет сгенерировано. (На моем компьютере MySQL прослушивает 3306).

Скорее всего, IP и порт в вашей базе данных строка подключения (см. здесь для ссылка) неверно, например установлен на какой-то порт, который не прослушивает никакая база данных.

См. Этот ответ и объяснение для Ошибка HTTP 408 Тайм-аут запроса (это та же ошибка).

РЕДАКТИРОВАТЬ:

Сначала я дал неправильный ответ (как указал EJP). Обе ошибки возникают на уровне TCP при установке соединения:

  • Connection refused означает, что на данном порту никто не слушает
  • Connection timeout означает, что соединение не может быть установлено или, как указано в EJP, время ожидания соединения истекло.

Предположим, у вас есть следующая строка в Java, в конечном итоге драйвер JDBC делает (что-то вроде) это в какой-то момент:

Socket s = new Socket(IP,PORT);

Перед выполнением этой строки соединение (TCP) закрыто. После выполнения этой строки и отсутствия исключения, соединение установлено (как указано в apidoc для конструктора). Пока эта строка выполняется, вот что происходит на самом деле (это называется трехстороннее рукопожатие TCP):

Трехстороннее рукопожатие TCP

Рассмотрим две возможные ситуации.

Во-первых, предположим, что IP-адрес доступен (например, ping IP из командной строки начинает выводить время ответа на консоль), но процесс не прослушивает ПОРТ. Трехстороннее рукопожатие произойдет, как показано на рисунке, но как только соединение будет установлено, сервер не найдет ни одного из своих процессов, прослушивающих этот порт, и немедленно инициирует закрытие соединения - будет брошено Connection refused .

Это единственно возможный исход для данного исключения.

Теперь предположим, что IP-адрес недоступен. Клиент отправит запрос на соединение, но никогда не получит соединение разрешено. По истечении заданного периода времени (тайм-аут) будет выдан Connection timeout. Рассмотрим следующий код:

    String reachableIP = "127.0.0.1";
    String unreachableIP = "10.192.0.1";
    int connTimeout = 1000;
    long duration = 0;        
    try {
        duration = System.currentTimeMillis();            
        new Socket().connect(new InetSocketAddress(unreachableIP, 3306), connTimeout);
    }
    catch (Exception e) {
        duration = System.currentTimeMillis() - duration;           
        System.out.println("connect attempt duration measured in ms:" + duration);
        System.out.println(e.getMessage());
    }

выходы:

connect attempt duration measured in ms:1009
connect timed out

Это также указано в apidoc для метода подключения. Таким образом, это исключение генерируется, если целевой IP-адрес недоступен. Однако причин недоступности компьютера в сети может быть множество. Первое, что приходит мне в голову, это то, что хост выключен, или, если перефразировать комментарий EJP:

Существует множество причин, таких как заполнение очереди невыполненных работ или проблемы с сетевым подключением, которые могут привести к этому исключению.

person linski    schedule 08.01.2013
comment
«Время ожидания соединения истекло» не означает, что никто не слушал. Это вызовет отказ в соединении, как в вашем собственном тесте. Это означает, что время ожидания подключения истекло, что может иметь ряд причин, например, заполнение очереди невыполненных работ или проблемы с сетевым подключением. - person user207421; 13.01.2013

В большинстве случаев проблема тайм-аута соединения возникает из-за прокси-сервера вашего Интернета. убедитесь, что вы указали все настройки прокси в сетевых настройках вашей IDE, а также ваши системные настройки прокси по умолчанию.

если проблема все еще сохраняется, вы должны попробовать без прокси-соединения ... надеюсь, что это поможет

person Rajesh Mbm    schedule 18.10.2013