Это означает, что драйвер попытался открыть соединение с этим 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):
Рассмотрим две возможные ситуации.
Во-первых, предположим, что 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