Java-соединение с mysql [duplicate]

Краткий ответ: ваш метод 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.

148
задан Eric Leschinski 23 October 2014 в 14:32
поделиться

22 ответа

Итак, у вас есть

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: сбой связи. java.net.ConnectException: соединение отклонено

Я цитирую из этот ответ , который также содержит пошаговое руководство по MySQL + JDBC:

Если вы получаете SQLException: Connection refused или Connection timed out или специфический для MySQL CommunicationsException: Communications link failure, то это означает, что БД недоступно. Это может иметь одну или несколько из следующих причин:

  1. IP-адрес или имя хоста в URL-адресе JDBC неверен.
  2. Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером.
  3. Номер порта отсутствует или неверен в URL-адресе JDBC.
  4. Сервер базы данных недоступен.
  5. Сервер БД не принимает соединения TCP / IP.
  6. У сервера БД закончились соединения.
  7. Что-то между Java и БД блокирует соединения, например брандмауэр или прокси.

Чтобы решить ту или иную, выполните следующие советы:

  1. Проверьте и проверьте их с помощью ping.
  2. Обновите DNS или используйте IP-адрес в URL-адрес JDBC.
  3. Проверьте его на основе my.cnf базы данных MySQL.
  4. Запустите БД.
  5. Убедитесь, что mysqld запускается без --skip-networking option.
  6. Перезапустите БД и исправьте свой код соответственно, чтобы он закрывал соединения в finally.
  7. Отключить брандмауэр и / или настроить брандмауэр / прокси, чтобы разрешить / переместите порт.

См. также:

192
ответ дан Community 27 August 2018 в 11:27
поделиться

То, что для меня решило, делает 2 вещи: 1. Создайте нового пользователя, кроме root, с помощью некоторого пароля, используя следующие команды:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

2. комментарий IP-адрес на mysqld.conf

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

0
ответ дан Abdul Khalid 27 August 2018 в 11:27
поделиться

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

-1
ответ дан aclokay 27 August 2018 в 11:27
поделиться

я решил эту проблему простым способом, который сработал для меня. У меня проблема с семей "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи". В моем файле db.properties у меня было это: url: jdbc: mysql: // localhost: 90 / myDB, удалили только URL-адрес порта, в результате чего появился url: jdbc: mysql: // localhost / myDB, и это сработало для меня .

2
ответ дан Dario Castro 27 August 2018 в 11:27
поделиться

Я поймаю это исключение, когда Java из кучи. Если я попытаюсь поместить в ОЗУ множество элементов данных - сначала я поймаю «Сбой связи» и следующий «OutOfMemoryError».

Я зарегистрировал его, и я уменьшаю потребление памяти (удаляю данные 1/2) и все в порядке.

7
ответ дан dreamcrash 27 August 2018 в 11:27
поделиться

Если вы изменили свой порт, вы получите такую ​​ошибку «com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи с каналом связи» Пожалуйста, проверьте номер вашего порта

2
ответ дан Erick G. Hagstrom 27 August 2018 в 11:27
поделиться

Это исключение com.mysql.jdbc.exceptions.jdbc4.CommunicationsException возникает, если соединение с базой данных простаивает в течение длительного времени.

Это незанятое соединение возвращает true на connection.isClosed();, но если мы попытаемся выполнить инструкцию, тогда оно запустит это исключение, поэтому я предлагаю пойти с пулом базы данных.

5
ответ дан Félix Gagnon-Grenier 27 August 2018 в 11:27
поделиться

Я столкнулся с той же проблемой в IntelliJ IDEA.

Чтобы решить проблему подключения, мне пришлось отключить (⌘ + F2 с использованием ключевых привязок по умолчанию на маке) и снова подключиться. Просто нажать «Обновить» было недостаточно.

-3
ответ дан furins 27 August 2018 в 11:27
поделиться

Попробуйте изменить localhost на 127.0.0.1.

Локальный хост будет разрешен ::1. И MySQL не может быть подключен через IPv6 по умолчанию.

И вот вывод telnet localhost 3306:

$ telnet localhost 3306
Trying ::1...

И ответа от сервера MySQL нет.

Конечно, убедитесь, что ваш сервер MySQL запущен.

0
ответ дан Haozhe Xie 27 August 2018 в 11:27
поделиться

У меня была та же проблема, и вот как она была исправлена:

  1. My .jsp вызывал атрибуты, которые я еще не определил в сервлете.
  2. I имел два имени столбца, которые я передавал в объект через ResultSet (getString("columnName")), который не соответствовал именам столбцов в моей базе данных.

Я не совсем уверен, какой из них исправил проблему, но это сработало. Кроме того, убедитесь, что вы создали новые Statement и ResultSet для каждого запроса таблицы.

0
ответ дан Incognito 27 August 2018 в 11:27
поделиться

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

Исключение в потоке «main» com.mysql.jdbc.exceptions .jdbc4.CommunicationsException: сбой связи. Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил никаких пакетов с сервера. at ...

Что произойдет, если вы попытаетесь (из терминала)

mysql -u username -p

Вам будет предложено ввести пароль, связанный с именем пользователя. После того, как вы дадите правильный пароль, подключился ли клиент mysql?

Возможно, вам придется запустить MySQL из настроек, если нет. Вы также можете запустить его при запуске.

5
ответ дан Karl Walsh 27 August 2018 в 11:27
поделиться

Он пытался подключиться к более старой версии MySQL («версия», «5.1.73»); когда вы используете новую версию драйвера, вы получаете сообщение об ошибке «com.mysql.cj.jdbc.Driver», даже если вам не нужно указывать, какой из них вы используете:

Загрузка класса 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 ответ

0
ответ дан manatico 27 August 2018 в 11:27
поделиться

Только что испытал это.

Чтобы заставить его работать с помощью: (это можно поместить в статическом блочном 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");

С уважением.

2
ответ дан mel3kings 27 August 2018 в 11:27
поделиться

Это случилось со мной, когда я изменил порт mysql с 3306 на 3307 в файлах my.ini и php.ini, но после изменения портов (3307-> 3306) он снова работал отлично.

2
ответ дан MrPencil 27 August 2018 в 11:27
поделиться

У меня такая же проблема часами. Я использую MAMP Server

Вместо использования localhost: [Apache Port] используйте ваш порт MySQL.

Ниже приведен порт MySQL по умолчанию для сервера MAMP.

String url = "jdbc:mysql://localhost:8889/db_name";

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
5
ответ дан Nathan Tuggy 27 August 2018 в 11:27
поделиться

У меня такая же ошибка, потому что я пытался запустить свою программу без запуска сервера mysql.

После запуска сервера mysql все пошло правильно.

3
ответ дан rs2012 27 August 2018 в 11:27
поделиться

В моем случае, оказалось, что версия 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 (да, она устарела, просто для имитации версии продукта). Поэтому я встретил ту же ошибку.

Поскольку причина найдена, решение также найдено. Сопоставьте версию!

2
ответ дан shellbye 27 August 2018 в 11:27
поделиться

Возможно, вы не запустили свой Mysql и Apache Server. После того, как я запустил сервер Apache и Mysql из панели управления XAMPP, соединение было успешно установлено.

Удачи!

0
ответ дан shivam gupta 27 August 2018 в 11:27
поделиться

Мой брандмауэр блокировал сообщение 3307, которое прослушивает мой MySQL. Поэтому я изменил порт с 3307 на 3306. Затем я могу успешно подключиться к базе данных.

0
ответ дан sipekmichal.cz 27 August 2018 в 11:27
поделиться

Загрузите 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" );
3
ответ дан stacker 27 August 2018 в 11:27
поделиться

Более ранние ответы подходят. Но я также хотел бы указать на более общую проблему.

Я столкнулся с подобной проблемой, и причиной было сетевое ограничение моей компании.

То же соединение получало успех, когда я был в любой другой сети.

3
ответ дан user207421 27 August 2018 в 11:27
поделиться

Это может быть простая проблема с jar. Возможно, вы используете старый mysql-connector-java-XXX-bin.jar, который не поддерживается вашей текущей версией mysql. Я использовал mysql-connector-java-5.1.18-bin.jar, поскольку использую mysql 5.5, и эта проблема решена для меня.

4
ответ дан xrcwrn 27 August 2018 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: