2013-12-26 4 views
0

У меня есть база данных mysql, созданная на малине pi, я хочу получить к ней доступ через Java-приложение, работающее на ноутбуке в той же локальной сети.Подключение к удаленной базе данных через Java

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

я подключить через следующую команду:

String URL = "jdbc:mysql://192.168.11.157/DB_name"; 
try { 
connection = DriverManager.getConnection(URL, USER, PASSWORD); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 

Однако исключение и ERROR: Не удается подключиться к базе данных. печатается на консоль.

Edit:

Зная, что: * Я могу получить доступ к базе данных через локальное приложение работает на ту же малиновой пи (я использовал @LOCAL). * Может успешно выполнить ping & SSH с малиной pi, даже запустить программу, упомянутую в предыдущей точке через SSH, и она отлично работает.

Трассировка стека:

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(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121) 
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:358) 
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2489) 
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2526) 
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2311) 
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834) 
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416) 
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347) 
at java.sql.DriverManager.getConnection(Unknown Source) 
at java.sql.DriverManager.getConnection(Unknown Source) 
at com.climacon.jdbc.db.JDBCMySQLConnection.createConnection(JDBCMySQLConnection.java:42) 
at com.climacon.jdbc.db.JDBCMySQLConnection.getConnection(JDBCMySQLConnection.java:51) 
at com.climacon.jdbc.main.ClimaConJDBC.get_Nodeinfo_From_DB(ClimaConJDBC.java:110) 
at com.climacon.gui.ClimaCon2$5.actionPerformed(ClimaCon2.java:279) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$200(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+0

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

+0

Заменить блок catch на} catch (SQLException e) { e.printStackTrace(); } Затем опубликуйте исключение – Sach

ответ

0

Решено:

  1. Перейти в файл my.cnf (Судо нано /etc/mysql/my.cnf) файл и искать "bind-address" и сделать его “bind-address = * “
  2. Reload MySQL конфигурации (Судо сервис MySQL перезарядка)
  3. сервер MySQL Restart (Судо служба MySQL рестарт)
-3

вам нужно напечатать исключение на консоль, а не печатать «ошибка» клиента, если вы делаете , как это, вы не можете получить ключ из проблема

+0

это должно быть в комментарии, а не в ответе. – Salah

-1

URL-адрес "jdbc: mysql: // localhost: 3306/mydb".

Вы потеряли порт 3306.

+0

«порт» не является обязательным. И даже «localhost», если на локальной машине. –

+0

Также OP использует 'String URL =" jdbc: mysql: //192.168.11.157/DB_name ";' –

+0

Можете ли вы получить доступ к серверу 192.168.11.157? – huanhuanw

4

Я думаю, что причина, вы не можете получить доступ к удаленному MySQL может быть связано с ограничением удаленного доступа в my.cnf
пожалуйста, проверьте линию
bind-address: установлен в 127.0.0.1
под этим ограничением вы не можете подключиться удаленно с этим сервером mysql;
, чтобы решить эту проблему, необходимо изменить эту строку:
bind-address: 0.0.0.0

кроме того, вы должны указать порт для подключения, как показано ниже:
String URL = "jdbc:mysql://192.168.11.157:3306/DB_name";
потому, что MySQL соединит порт 3306 в дефолте.
Желаю, чтобы мой ответ помог вам!

+0

извините, но я действительно не знаю, где я могу найти mysql.cnf или как его открыть, я новичок в mysql, базах данных и серверах в целом. –

+0

Если вы используете linux, вы можете найти его в /etc/mysql/my.cnf. извините за опечатку в моем ответе! – Rugal

+0

Я нашел следующий учебник: 1. Предоставьте доступ к удаленному компьютеру. 2. Перейдите в файл my.cnf (sudo nano /etc/mysql/my.cnf) и найдите «bind-address» и прокомментируйте это (поставьте # перед линией) 3. Перезагрузите MySQL config (service mysql reload) 4. Перезагрузите сервер MySQL (перезагрузка службы mysql) Поскольку я уже сделал номер 1, я сделал номер 2 (также пытался сделать его 0.0.0.0, как вы сказали). Однако, когда я использую службу mysql reload, я получаю следующее сообщение: Неустранимая ошибка при обработке по умолчанию. Программа прервана –

0

Вы должны проверить следующие вещи:

  1. Является ли база данных активна? Отвечает ли он на другое приложение, кроме вашего?
  2. Является ли подключение к сети ОК (например, межсетевым экраном)?
  3. Проверьте connection strings (возможно, порт является необходимым, но я не уверен).

Я не очень хорошо знаком с малиной. Кажется, что он использует операционную систему linux (исправьте меня, если я ошибаюсь). В сообщении this даны инструкции о том, как отключить брандмауэр на устройстве. В нем говорится, что брандмауэр является обычным брандмауэром iptables, используемым в Linux-системах. Я нахожу this iptables tutorial (based on ubuntu) очень полезным.Возможно, это даст вам несколько советов.

Надеюсь, я помог!

+0

1- До сих пор база данных реагирует только на другое Java-приложение, которое работает на одном и том же малине pi (я использую @localhost в этом приложении), но i Я пытаюсь создать первое приложение для доступа к нему с другого компьютера, и это то, что не работает. 2- Не знаю никаких настроек брандмауэра на малине pi. 3- Я думаю, что все правильно, потому что я смог получить доступ к той же базе данных, когда это было на моем компьютере. Я просто использовал ip, как упоминалось выше. –

+0

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

+0

Спасибо за вашу заботу, но я хочу задать вопрос, прежде чем вдаваться в подробности. Если есть проблема с брандмауэром, могу ли я получить SSH в Raspberry pi & Также мог бы пинг с терминала? Потому что оба работают отлично со мной прямо сейчас. –

0

Возможно, вы можете выполнить ping raspberry pi, но я не уверен, что такое интерфейс.

Почему бы вам не использовать MySQL Ping и посмотреть, отвечает ли он?
Иначе это должна быть проблема с сетью. Разрешите его, а затем подключитесь. Никаких альтернатив для этого.

На ваш сервер базы данных вы можете отправить небольшой вес ping, чтобы проверить доступность соединения.
Пожалуйста, прочитайте следующую дискуссию и статьи:

  1. Ping MySQL Server
  2. Ping syntax and example
  3. My answer to one of such Communication link failures.
Смежные вопросы