Я работаю над тем, чтобы моя база данных говорила с моими Java-программами.
Может ли кто-нибудь дать мне быструю и грязную программу-образец с помощью JDBC?
Я получаю довольно грозную ошибку:
Exception in thread "main" 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.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
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.ConnectionImpl.getInstance(ConnectionImpl.java:357)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:207)
at SqlTest.main(SqlTest.java:22)
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 refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:218)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293)
... 13 more
Содержимое тестового файла:
import com.mysql.jdbc.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlTest {
public static void main(String [] args) throws Exception {
// Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// // edit the jdbc url
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/projects?user=user1&password=123");
// Statement st = conn.createStatement();
// ResultSet rs = st.executeQuery( "select * from table" );
System.out.println("Connected?");
}
}
Итак, у вас есть
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи
java.net.ConnectException: соединение отклонено
Я цитирую этот ответ, который также содержит пошаговое руководство по MySQL + JDBC:
Если вы получаете
SQLException: Connection refused
илиConnection timed out
или специфический для MySQLCommunicationsException: Communications link failure
, то это означает, что БД вообще недоступна. Это может иметь одну или несколько следующих причин:
- Неверный IP-адрес или имя хоста в URL-адрес JDBC.
- Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером.
- Номер порта отсутствует или неверен в URL-адресе JDBC.
- Сервер DB не работает.
- Сервер DB не принимает соединения TCP/IP.
- У сервера БД закончились соединения.
- Что-то между Java и DB блокирует соединения, например. брандмауэр или прокси.
Чтобы решить тот или иной, выполните следующие советы:
- Проверьте и проверьте их с помощью
ping
.- Обновите DNS или используйте IP-адрес в URL-адрес JDBC.
- Проверьте его на основе
my.cnf
базы данных MySQL.- Запустите БД.
- Убедитесь, что mysqld запущен без
--skip-networking option
.- Перезагрузите базу данных и исправьте свой код соответствующим образом, чтобы он закрывал соединения в
finally
.- Отключите брандмауэр и/или настройте брандмауэр/прокси для разрешения/пересылки порта.
Это исключение com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
возникает, если соединение с базой данных простаивает долгое время.
Это бездействующее соединение возвращает true на connection.isClosed();
, но если мы попытаемся выполнить оператор, то оно запустит это исключение, поэтому я предлагаю пойти с пулом базы данных.
Я поймаю это исключение, когда Java из кучи. Если я попытаюсь поместить в ОЗУ множество элементов данных - сначала поймаю Сбой связи "и далее" OutOfMemoryError ".
Я зарегистрировал его, и я уменьшаю потребление памяти (удаляю 1/2 данных) и все нормально.
Это лучшее решение,
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/DBname", "root", "root");
Connection con = DriverManager.getConnection(
"jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");
Замена локального хоста на ваш IP-адрес
У меня была такая же проблема часами. Я использую сервер MAMP
Вместо использования localhost: [Apache Port] используйте ваш порт MySQL.
Ниже представлен порт MySQL по умолчанию для сервера MAMP.
String url = "jdbc:mysql://localhost:8889/db_name";
Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
Я мог бы лаять неправильное дерево здесь, но ваше исключение, похоже, указывает на то, что ваш сервер MySQL недоступен.
Исключение в потоке "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи. Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил никаких пакетов с сервера. на...
Что произойдет, если вы попробуете (из терминала)
mysql -u username -p
Вам будет предложено ввести пароль, связанный с именем пользователя. После того, как вы дадите правильный пароль, подключается ли клиент mysql?
Возможно, вам придется запустить MySQL из настроек, если нет. Вы также можете установить его для запуска при запуске.
localhost
я использую правильное имя пользователя / пароль, и он работает нормально.
Более ранние ответы подходят. Но я также хотел бы указать на более общую проблему.
Я столкнулся с подобной проблемой, и причиной было сетевое ограничение моей компании.
То же соединение было успешным, когда я был в любой другой сети.
В моем случае, оказалось, что версия 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 (да, она устарела, просто для имитации версии продукта). Поэтому я встретил ту же ошибку.
Поскольку причина найдена, решение также найдено. Сопоставьте версию!
Обновите свой IP-адрес в файле /etc/mysql/my.cnf
bind-address = <IP_ADDRESS>
Перезапустите службы mysql deamon и mysql.
У меня такая же ошибка, потому что я пытался запустить свою программу без запуска сервера mysql.
После запуска сервера mysql все пошло правильно.
Загрузите 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" );
Это случилось со мной, когда я изменил порт mysql с 3306 на 3307 в файлах my.ini и php.ini, но после изменения портов (3307- > 3306) он снова работал отлично.
Я решил эту проблему простым способом, который сработал у меня. У меня проблема с семей "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи". В моем файле db.properties у меня было это: url: jdbc: mysql://localhost: 90/myDB, только удалил URL-адрес порта, в результате чего появился url: jdbc: mysql://localhost/myDB, и это сработало для меня.
Если вы изменили свой порт, вы получите такую ошибку: "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи связи" Проверьте номер порта
Если вы используете сервер WAMP
или XAMP
для установки базы данных mysql.
Затем вы должны явно запустить mysql sever другим, чтобы он показывал
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
при подключении к базе данных
Моя же проблема решается следующими шагами:
перейти к my.cnf
vi /etc/mysql/my.cnf
изменить свой адрес привязки
"#bind-address = 127.0.0.1"
перезапустить mysql
sudo /etc/init.d/mysql restart
Просто испытал это.
Чтобы сделать его работу: (это может быть помещено в статическом блочном 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
Добавьте удаленного пользователя в Mysql для примера IP = remoteIP:
mysql -u xxxx -p //local coonection to mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO 'theNewUser'@'remoteIP' IDENTIFIED BY 'passWord';
//Query OK, 0 rows affected (xx sec)
mysql> FLUSH PRIVILEGES;
//Query OK, 0 rows affected
Разрешить удаленный доступ к Mysql (по умолчанию все внешние вызовы не разрешены):
Edit
/etc/mysql/mysql.conf.d/mysqld.cnf or /etc/mysql/my.cnf
Change line: bind-address = 127.0.0.1 to
#bind-address = 127.0.0.1
Restart Mysql: /etc/init.d/mysql restart
Для последней версии драйвера JDBC, JDBC:
jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC'
jdbc.user='theNewUser'
В моем случае мне пришлось установить ssh-туннель к удаленной базе данных, и все настройки были правильными, и тестирование соединения с PhpStorm также прошло успешно. А также схема была загружена, но не данные. Вместо этого я получил:
[08S01] 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.
Ни одно из предложенных выше предложений не сработало. По какой-то причине я пытался решить проблему, просто перезапустив PhpStorm и вуаля, это сработало!
Откройте файл /etc/mysql/my.cnf: измените параметр ниже из
bind-address = 127.0.0.1 to bind-address = 192.168.0.3 #this is your local system IP Address
,
Запустите команду ниже в mysql для определенного IP Address->
grant all privileges on dbname.* to dbusername@'192.168.0.3' IDENTIFIED BY 'dbpassword';
Если вы хотите дать доступ ко всем IP-адресам, выполните следующую команду:
grant all privileges on dbname.* to dbusername@'%' IDENTIFIED BY 'dbpassword';
Я столкнулся с той же проблемой, когда я запускал свое приложение,
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.
Проблема заключалась в том, что в файле mysql /etc/mysql/mysql.conf.d/mysqld.cnf конфигурация была такой
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
Итак, как мы видим, что адрес связывания указывает на 127.0.0.1, поэтому для запуска вашего приложения простое решение заключается в том, что мы можем использовать jdbc: mysql://127.0.0.1: 3306/pizzeria вместо jdbc: mysql://localhost: 3306/pizzeria, который подключит mysql к приложению или другому решению, состоит в том, что вы можете проверить и изменить конфигурации mysql на default. Оба решения могут работать. Я надеюсь, что это сработает и для вас, ребята.
В моем MacBook я решил эту ошибку только при переустановке новой версии eclipse EE и удалении локальных серверов, таких как xamp mysql или mamp, но использую только один из них...
Мой брандмауэр блокировал пост 3307, который слушал мой MySQL. Поэтому я изменил порт с 3307 на 3306. Затем я могу успешно подключиться к базе данных.
Он пытался подключиться к более старой версии MySQL ('version', '5.1.73'); когда вы используете более новую версию драйвера, вы получаете сообщение об ошибке "com.mysql.cj.jdbc.Driver" или даже то, что вам не нужно указывать, какой драйвер вы используете:
Загрузка класса
com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
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
Я столкнулся с той же проблемой в IntelliJ IDEA.
Чтобы решить проблему подключения, мне пришлось отключить (⌘ + F2 с использованием ключевых привязок по умолчанию на маке) и снова подключиться. Просто нажать "Обновить" было недостаточно.
То, что для меня решило, делает 2 вещи: 1. Создайте нового пользователя, отличного от root, с помощью некоторого пароля, используя следующие команды:
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;
2. комментарий IP-адрес строки на mysqld.conf
затем подключитесь к новому имени пользователя и паролю. он должен работать.
Возможно, вы не запустили свой Mysql и Apache Server. После того как я запустил сервер Apache и Mysql из панели управления XAMPP, соединение было успешно установлено.
Удачи!
Попробуйте изменить localhost
на 127.0.0.1
.
Локальный хост будет разрешен ::1
. И MySQL не может быть подключен через IPv6 по умолчанию.
И вот вывод telnet localhost 3306
:
$ telnet localhost 3306
Trying ::1...
И от сервера MySQL нет ответа.
Конечно, убедитесь, что ваш сервер MySQL запущен.
Если есть какие-либо читатели, которые столкнулись с этой проблемой для доступа к удаленному серверу: убедитесь, что порт открыт
Это может быть простая проблема с jar. Возможно, вы используете старый mysql-connector-java-XXX-bin.jar
, который не поддерживается текущей версией mysql. Я использовал mysql-connector-java-5.1.18-bin.jar
, поскольку я использую mysql 5.5
, и эта проблема разрешена для меня.
У меня была та же проблема, и вот как она была исправлена:
ResultSet (getString("columnName"))
, который не соответствовал именам столбцов в моей базе данных.Я не совсем уверен, какой из них исправил проблему, но это сработало. Кроме того, убедитесь, что вы создаете новые Statement
и ResultSet
для каждого запроса таблицы.
Также ваш сервер может быть просто закрыт. На Mac перейдите на панель настроек mySQL через прожектор. Если там, установите флажок, чтобы запустить сервер при запуске компьютера и запустить сервер.