【问题标题】:Jdbc - Connect remote Mysql Database errorJdbc - 连接远程Mysql数据库错误
【发布时间】:2012-10-20 04:18:45
【问题描述】:

[已解决]

我终于解决了问题,连接一切正常吗...

问题出在 SQL 查询中,我在名为“arduinoData”的表中进行选择,而真正的名称是“arduinodata”。

这种方式在本地有效,但是当我在网上尝试时,它没有。

因此,返回为“null”,Java 试图解析它并显示错误。

很抱歉给大家添麻烦了,谢谢大家。


我正在使用 JDBC 将我的程序连接到 MySQL 数据库。

我已经输入了端口号,是的,我的数据库有权访问。

当我使用 localhost 时工作正常,但是当我尝试连接到远程 MySQL 数据库时,在控制台上显示此错误。

java.lang.ExceptionInInitializerError
Caused by: java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:454)
    at java.lang.Integer.parseInt(Integer.java:527)
    at serial.BDArduino.<clinit>(BDArduino.java:25)
Exception in thread "main" Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

提前谢谢你!

【问题讨论】:

  • 你还要在mysql中开启远程访问,默认只接受来自localhost的访问,你开启了吗?

标签: java mysql database jdbc


【解决方案1】:

注意:这原本是一条评论,但太长了。似乎人们看到 NFE 并猜测它是空的端口。这是误导。这是一个显示端口的工作代码不是必需的。请避免误导性答案。

        try {
          Class.forName("com.mysql.jdbc.Driver");
          String sourceURL = "jdbc:mysql://localhost/sodb";

          Connection conn = DriverManager.getConnection(sourceURL, "naishe", "p2ssword");
          Statement st = conn.createStatement();
          ResultSet rs = st.executeQuery("select count(*) from test_tab");
          while(rs.next()){
              System.out.println(rs.getString(1));
          }
        } catch(ClassNotFoundException cnfe) {
          System.err.println(cnfe);
        } catch(SQLException sqle) {
          System.err.println(sqle);
        }

它正确打印3(这是表test_tab中的记录数)。


如果你使用标准驱动,你不需要端口,默认为3306!看这里 http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html

JDBC URL 格式

MySQL Connector/J 的 JDBC URL 格式如下,方括号 ([, ]) 中的项目是可选的:

jdbc:mysql://[host][,failoverhost...][:port]/[database] » [?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...

如果未指定主机名,则默认为 127.0.0.1。 如果未指定端口,则默认为 3306,这是 MySQL 服务器的默认端口号。

【讨论】:

  • @NandkumarTekale 你真的读过代码吗?我正在使用 MySQL 而不是使用端口,它可以工作!您不必提供端口。默认为 3306。
  • 如果您向我出示文档证明,我将删除反对票
  • @NandkumarTekale 我担心的不是你的反对票,而是人们需要的 RTFD 数量。
【解决方案2】:

我认为您在连接字符串中遗漏了端口号。

static String url = "jdbc:mysql://mysql.mydomain.com.br:3306/myDB";

代替

static String url = "jdbc:mysql://mysql.mydomain.com.br/myDB";

现在如果遇到同样的错误意味着您可以将 mysql.mydomain.com.br 替换为 IP 地址,如下所示:

只需在您的数据库连接字符串中提供远程机器的 IP / 主机名,而不是 mysql.mydomain.com.br。例如:

jdbc:mysql://172.16.15.225:3306/yourdatabase

还要检查没有防火墙阻止对端口 3306 的访问。

确保您正在连接的用户被允许从这个特定的主机名进行连接。对于开发环境,这样做是安全的

'username'@'%'

这是为用户授予权限 GRANT manual.

【讨论】:

  • 你使用了IP地址和端口号吗?现在出现什么错误?
  • @GuilhermeRuiz 请在您的问题中更新您的堆栈跟踪,这对所有人都有帮助
  • 同样的错误——java.lang.ExceptionInInitializerError 原因:java.lang.NumberFormatException: null at java.lang.Integer.parseInt(Integer.java:454) at java.lang.Integer。 parseInt(Integer.java:527) at serial.BDArduino.(BDArduino.java:25) 线程“main”Java 结果中的异常:1 CONSTRUÍDO COM SUCESSO(总节奏:1 segundo)
  • int sql8 = Integer.parseInt(Sql.getDBinfo("SELECT * FROM arduinoData WHERE id=1", "pin8"));检查这一行。在您的应用程序中,您尝试将字符串转换为 Numberic。但它似乎无法正常工作。
【解决方案3】:

你应该在你的connection url as 3306中使用port numbers,并且如果没有授予用户访问数据库的权限,你应该授予用户访问远程数据库的权限,请参考link

【讨论】:

  • 我确定我使用的端口号和我的数据库有权限
  • arduinoData 的桌子设计是什么?据我了解,表明该应用程序已尝试将字符串转换为我认为的一种数字类型
  • 请告诉我投反对票的原因,它可以帮助我纠正我的错误吗?感谢您的反对
  • 不是投票者,例外是NumberFormatException,它是在从数据库中读取值后得到的,所以你的答案是无关紧要的。
  • @NandkumarTekale Okies。没关系。我按照他提到的问题标签提出了建议。稍后对于堆栈跟踪 NFE 错误,我评论了字符串转换为数字类型。
猜你喜欢
  • 2013-08-14
  • 2012-10-20
  • 2011-11-24
  • 2016-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多