【问题标题】:Connecting to a Remote Database through Java通过 Java 连接到远程数据库
【发布时间】:2014-01-13 22:01:47
【问题描述】:

我在树莓派上创建了一个 mysql 数据库,我想通过在同一本地网络中的笔记本电脑上运行的 java 应用程序访问它。

我尝试将同一个应用程序与网络上另一台计算机上的另一个数据库连接起来,并且成功了。我不知道为什么它不适用于 RPI。

我通过以下命令连接:

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

但是,会引发异常并出现错误:无法连接到数据库。打印到控制台。

编辑:

知道: * 我可以通过在同一个树莓派上运行的本地应用程序访问数据库(我使用了@local)。 * 可以用树莓派ping & SSH 成功,甚至可以通过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)

【问题讨论】:

  • 首先你应该打印出你得到的异常,它可能只是让你知道问题所在。
  • 用 } catch (SQLException e) { e.printStackTrace(); 替换 catch 块} 然后发布异常

标签: java mysql database raspberry-pi


【解决方案1】:

您需要将异常打印到控制台,而不是打印客户“错误”,如果您这样做 那样,你无法得到问题的关键

【讨论】:

  • 这应该在评论中,而不是回答。
【解决方案2】:

网址“jdbc:mysql://localhost:3306/mydb”。

你丢失了 3306 端口。

【讨论】:

  • port 是可选的。甚至 localhost 如果在本地机器上。
  • OP 也在使用String URL = "jdbc:mysql://192.168.11.157/DB_name";
  • 可以访问服务器192.168.11.157吗?
【解决方案3】:

我认为你无法访问远程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端口。
希望我的回答能帮到你!

【讨论】:

  • 对不起,但我真的不知道在哪里可以找到 mysql.cnf 或如何打开它,我是 mysql 、数据库和服务器的新手。
  • 如果你使用的是linux,你可以在/etc/mysql/my.cnf中找到它。对不起,我的回答中的错字!
  • 我找到了以下教程: 1. 授予对远程计算机的访问权限。 2. 进入 my.cnf 文件 (sudo nano /etc/mysql/my.cnf) 文件并查找“bind-address”并将其注释掉(在行前放一个#) 3. 重新加载 MySQL 配置( service mysql reload) 4. 重启 MySQL 服务器 (service mysql restart) 因为我已经完成了第 1 项,所以我做了第 2 项(也尝试将其设为 0.0.0.0,如你所说)。但是,当我使用 service mysql reload 时,我收到以下消息:默认处理中的致命错误。程序中止
  • 你给我的指导是对的,就是你想的bind-address,但是修改后必须使用reload。谢谢
  • 其实我只是想在修改完my.cnf后重启
【解决方案4】:

你必须检查接下来的事情:

  1. 数据库是否处于活动状态?它是否响应您以外的其他应用程序?
  2. 网络连接是否正常(例如防火墙)?
  3. 检查connection strings(也许端口是必需的,但我不确定)。

我对覆盆子不是很熟悉。似乎它使用的是 linux 操作系统(如果我错了,请纠正我)。在this 帖子中,给出了如何禁用设备上的防火墙的说明。它说防火墙是linux系统上常用的iptables防火墙。我发现this iptables tutorial (based on ubuntu) 非常有用。也许它会给你一些指导。

希望我能帮上忙!

【讨论】:

  • 1- 到现在为止,数据库只响应在同一个树莓派上运行的另一个 java 应用程序(我在那个应用程序中使用@localhost),但我正在尝试构建第一个访问的应用程序它来自另一台计算机,这就是行不通的。 2-不知道树莓派上的任何防火墙设置。 3-我认为我做对了,因为当它在我的计算机上时,我能够访问相同的数据库。我只是使用了上面提到的ip。
  • 检查我编辑的答案。我将详细信息放在主要答案主体上,以便其他用户更容易访问。
  • 感谢您的关注,但在详细介绍这些细节之前,我想问一个问题。如果防火墙有问题,我可以通过 SSH 连接到 Raspberry pi 并且还可以从终端 ping 吗?因为现在两者都适合我。
  • 关于通过 SSH 访问树莓派的问题,我真的无法回答您。我看不出您无法通过 SSH 访问它的原因,但正如我所说,我不是该设备的专家。我想this 可以提供一些指导……
  • 你误解了我的意思,我的意思是我可以通过 SSH 成功访问树莓派,那么,我面临的问题仍然是防火墙问题吗?如果是防火墙问题,不是说 SSH 也不能工作吗?
【解决方案5】:

您也许可以 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

【讨论】:

    【解决方案6】:

    已解决:

    1. 进入 my.cnf 文件 (sudo nano /etc/mysql/my.cnf) 文件并 寻找"bind-address" 并使其成为“bind-address = * “
    2. 重新加载 MySQL 配置(sudo service mysql reload)
    3. 重启 MySQL 服务器(sudo service mysql restart)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-27
      • 2010-12-30
      • 2014-10-26
      • 1970-01-01
      • 2019-11-13
      • 2019-08-05
      • 1970-01-01
      相关资源
      最近更新 更多