Краткий ответ: ваш метод foo()
возвращается немедленно, а вызов $ajax()
выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.
В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo()
и сохранить результаты в члене этого объекта после завершения асинхронного вызова.
function foo(result) {
$.ajax({
url: '...',
success: function(response) {
result.response = response; // Store the async result
}
});
}
var result = { response: null }; // Object to hold the async result
foo(result); // Returns before the async completes
Обратите внимание, что вызов foo()
] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response
.
Итак, у вас есть
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: сбой связи. java.net.ConnectException: соединение отклонено
blockquote>Я цитирую из этот ответ , который также содержит пошаговое руководство по MySQL + JDBC:
Если вы получаете
SQLException: Connection refused
илиConnection timed out
или специфический для MySQLCommunicationsException: Communications link failure
, то это означает, что БД недоступно. Это может иметь одну или несколько из следующих причин:
- IP-адрес или имя хоста в URL-адресе JDBC неверен.
- Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером.
- Номер порта отсутствует или неверен в URL-адресе JDBC.
- Сервер базы данных недоступен.
- Сервер БД не принимает соединения TCP / IP.
- У сервера БД закончились соединения.
- Что-то между Java и БД блокирует соединения, например брандмауэр или прокси.
Чтобы решить ту или иную, выполните следующие советы:
blockquote>
- Проверьте и проверьте их с помощью
ping
.- Обновите DNS или используйте IP-адрес в URL-адрес JDBC.
- Проверьте его на основе
my.cnf
базы данных MySQL.- Запустите БД.
- Убедитесь, что mysqld запускается без
--skip-networking option
.- Перезапустите БД и исправьте свой код соответственно, чтобы он закрывал соединения в
finally
.- Отключить брандмауэр и / или настроить брандмауэр / прокси, чтобы разрешить / переместите порт.
См. также:
То, что для меня решило, делает 2 вещи: 1. Создайте нового пользователя, кроме root, с помощью некоторого пароля, используя следующие команды:
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;
2. комментарий IP-адрес на mysqld.conf
, затем подключиться с новым именем пользователя и паролем. он должен работать.
Если есть какие-либо читатели, которые столкнулись с этой проблемой для доступа к удаленному серверу: убедитесь, что порт открыт
я решил эту проблему простым способом, который сработал для меня. У меня проблема с семей "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи". В моем файле db.properties у меня было это: url: jdbc: mysql: // localhost: 90 / myDB, удалили только URL-адрес порта, в результате чего появился url: jdbc: mysql: // localhost / myDB, и это сработало для меня .
Я поймаю это исключение, когда Java из кучи. Если я попытаюсь поместить в ОЗУ множество элементов данных - сначала я поймаю «Сбой связи» и следующий «OutOfMemoryError».
Я зарегистрировал его, и я уменьшаю потребление памяти (удаляю данные 1/2) и все в порядке.
Если вы изменили свой порт, вы получите такую ошибку «com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи с каналом связи» Пожалуйста, проверьте номер вашего порта
Это исключение com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
возникает, если соединение с базой данных простаивает в течение длительного времени.
Это незанятое соединение возвращает true на connection.isClosed();
, но если мы попытаемся выполнить инструкцию, тогда оно запустит это исключение, поэтому я предлагаю пойти с пулом базы данных.
Я столкнулся с той же проблемой в IntelliJ IDEA.
Чтобы решить проблему подключения, мне пришлось отключить (⌘ + F2 с использованием ключевых привязок по умолчанию на маке) и снова подключиться. Просто нажать «Обновить» было недостаточно.
Попробуйте изменить localhost
на 127.0.0.1
.
Локальный хост будет разрешен ::1
. И MySQL не может быть подключен через IPv6 по умолчанию.
И вот вывод telnet localhost 3306
:
$ telnet localhost 3306
Trying ::1...
И ответа от сервера MySQL нет.
Конечно, убедитесь, что ваш сервер MySQL запущен.
У меня была та же проблема, и вот как она была исправлена:
ResultSet (getString("columnName"))
, который не соответствовал именам столбцов в моей базе данных. Я не совсем уверен, какой из них исправил проблему, но это сработало. Кроме того, убедитесь, что вы создали новые Statement
и ResultSet
для каждого запроса таблицы.
Я мог бы лаять неправильное дерево здесь, но ваше исключение, похоже, указывает на то, что ваш сервер MySQL недоступен.
Исключение в потоке «main» com.mysql.jdbc.exceptions .jdbc4.CommunicationsException: сбой связи. Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил никаких пакетов с сервера. at ...
blockquote>Что произойдет, если вы попытаетесь (из терминала)
mysql -u username -p
Вам будет предложено ввести пароль, связанный с именем пользователя. После того, как вы дадите правильный пароль, подключился ли клиент mysql?
Возможно, вам придется запустить MySQL из настроек, если нет. Вы также можете запустить его при запуске.
Он пытался подключиться к более старой версии MySQL («версия», «5.1.73»); когда вы используете новую версию драйвера, вы получаете сообщение об ошибке «com.mysql.cj.jdbc.Driver», даже если вам не нужно указывать, какой из них вы используете:
Загрузка класса
blockquote>com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.cj.jdbc.Driver '. Драйвер автоматически регистрируется через SPI, и ручная загрузка класса драйвера вообще не нужна.Я изменил объявление использовать версию mysql-connector-java версии 5.1.38, а в коде я сохранил файл com.mysql.jdbc.Driver.
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency>
Все началось, когда я увидел Ankit Jain's ответ
Только что испытал это.
Чтобы заставить его работать с помощью: (это можно поместить в статическом блочном intializer)
static{ // would have to be surrounded by try catch
Class.forName("com.mysql.jdbc.Driver"); // this will load the class Driver
}
Также, получив соединение через:
conn = DriverManager.getConnection(DBURL,<username>,<password>);
вместо указания параметров входа
Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
С уважением.
Это случилось со мной, когда я изменил порт mysql с 3306 на 3307 в файлах my.ini и php.ini, но после изменения портов (3307-> 3306) он снова работал отлично.
У меня такая же проблема часами. Я использую MAMP Server
Вместо использования localhost: [Apache Port] используйте ваш порт MySQL.
Ниже приведен порт MySQL по умолчанию для сервера MAMP.
String url = "jdbc:mysql://localhost:8889/db_name";
Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
У меня такая же ошибка, потому что я пытался запустить свою программу без запуска сервера mysql.
После запуска сервера mysql все пошло правильно.
В моем случае, оказалось, что версия mysql-connector-java
была высокой.
В моей демонстрации я как-то использую mysql-connector-java
следующим образом:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
Но в среде разработки я использую это:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
И моя версия MySQL была 5.1.48 (да, она устарела, просто для имитации версии продукта). Поэтому я встретил ту же ошибку.
Поскольку причина найдена, решение также найдено. Сопоставьте версию!
Возможно, вы не запустили свой Mysql и Apache Server. После того, как я запустил сервер Apache и Mysql из панели управления XAMPP, соединение было успешно установлено.
Удачи!
Мой брандмауэр блокировал сообщение 3307, которое прослушивает мой MySQL. Поэтому я изменил порт с 3307 на 3306. Затем я могу успешно подключиться к базе данных.
Загрузите MySQL-JDBC-Type-4-Treiber (ig 'mysql-connector-java-5.1.11-bin.jar' из 'mysql-connector-java-5.1.11.zip') в Mysql .
В процессе компиляции и выполнения в вашем пути к классам необходимо задействовать кувшин драйвера.
Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );
Более ранние ответы подходят. Но я также хотел бы указать на более общую проблему.
Я столкнулся с подобной проблемой, и причиной было сетевое ограничение моей компании.
То же соединение получало успех, когда я был в любой другой сети.
Это может быть простая проблема с jar. Возможно, вы используете старый mysql-connector-java-XXX-bin.jar
, который не поддерживается вашей текущей версией mysql. Я использовал mysql-connector-java-5.1.18-bin.jar
, поскольку использую mysql 5.5
, и эта проблема решена для меня.