Java 使用公共IP远程访问MySQL数据库时出错

Java 使用公共IP远程访问MySQL数据库时出错,java,mysql,Java,Mysql,我有一个MySQL数据库。我的朋友正在尝试使用我的公共IP从另一台计算机访问它 这是他用来测试连接的程序: public class Main { public static void main(String args[]) { String url = "jdbc:mysql://IPadresss:3307/javabase"; String username = "bob"; String password = "bob";

我有一个MySQL数据库。我的朋友正在尝试使用我的公共IP从另一台计算机访问它

这是他用来测试连接的程序:

public class Main {
    public static void main(String args[]) {

        String url = "jdbc:mysql://IPadresss:3307/javabase";
        String username = "bob";
        String password = "bob";
        Properties properties = new Properties();
        properties.setProperty("bob", "bob");
        properties.setProperty("bob", "bob");
        properties.setProperty("useSSL", "false");
        properties.setProperty("autoReconnect", "true");

        System.out.println("Connecting database...");

        try (Connection connection = DriverManager.getConnection(url, properties)) {
            System.out.println("Database connected!");
        } catch (SQLException e) {
            throw new IllegalStateException("Cannot connect the database!", e);
        }
    }
}
这是我的客户朋友得到的错误:


正在连接数据库。。。 线程“main”java.lang.IllegalStateException中出现异常:无法连接数据库! 位于SQLConnector.Main.Main(Main.java:23) 原因:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:无法创建到数据库服务器的连接。尝试重新连接3次。放弃。 位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:423) 位于com.mysql.jdbc.Util.HandleneInstance(Util.java:425) 位于com.mysql.jdbc.Util.getInstance(Util.java:408) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) 位于com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2163) 位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2088) 位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:806) 位于com.mysql.jdbc.JDBC4Connection(JDBC4Connection.java:47) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:423) 位于com.mysql.jdbc.Util.HandleneInstance(Util.java:425) 位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410) 位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328) 位于java.sql.DriverManager.getConnection(DriverManager.java:664) 位于java.sql.DriverManager.getConnection(DriverManager.java:208) 位于SQLConnector.Main.Main(Main.java:20) 导致的原因:java.sql.SQLException:拒绝用户“@”的ip访问(使用密码:否) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964) 在com.mysql.jdbc.MysqlIO.checkErrorPacket上(MysqlIO.java:3970) 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906)上 在com.mysql.jdbc.MysqlIO.checkErrorPacket上(MysqlIO.java:873) 在com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1710)上 位于com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226) 位于com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253) 位于com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2104) ... 还有13个
请帮助我找出连接到服务器的方法有什么问题,我已远程授予我的朋友(用户“bob”)权限。

因此,您有以下错误:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障java.net.ConnectException:连接 拒绝

这种情况的发生有多种原因,我引用

如果收到
SQLException:连接被拒绝
连接超时
或者特定于MySQL的
通信异常
:通信链接 失败,则表示根本无法访问数据库

这可能有以下一个或多个原因:

  • JDBC URL中的IP地址或主机名错误
  • 本地DNS服务器无法识别JDBC URL中的主机名
  • JDBC URL中缺少端口号或端口号错误。[假设您提到的是正确的]
  • 数据库服务器已关闭
  • DB服务器不接受TCP/IP连接
  • 数据库服务器的连接已用完
  • Java和DB之间的某些东西正在阻止连接,例如防火墙或代理
  • 要解决其中一个问题,请遵循以下建议:

  • 用ping验证和测试它们
  • 刷新DNS或改用JDBC URL中的IP地址
  • 基于MySQL DB的my.cnf进行验证
  • 启动数据库
  • 验证mysqld是否在没有--skip networking选项的情况下启动
  • 重新启动数据库并相应地修复代码,使其最终关闭连接
  • 禁用防火墙和/或配置
  • 允许/转发端口的防火墙/代理

  • 如果你把一个mysql数据库放在一个公共IP上,即使假设没有人能够找出你的用户名和密码,他们也可以非常非常容易地攻击你的sql数据库并将其关闭。因此,只对有效的客户端IP打开防火墙。或者使用更安全的方法(我建议使用ssh隧道)。人们会在任何端口上找到一个全球可访问的开放服务。堆栈跟踪似乎表明问题来自MySQL访问控制:“用户@'的Freinds ip的访问被拒绝”(使用密码:否)”。最好的解决方案可能是使用密码为您的朋友创建一个数据库用户,并授予该用户从所有计算机或(更好)特别是从他正在使用的计算机访问数据库的权限。
    Connecting database...
    Exception in thread "main" java.lang.IllegalStateException: Cannot connect the database!
     at SQLConnector.Main.main(Main.java:23)
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
     at com.mysql.jdbc.Util.getInstance(Util.java:408)
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
     at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2163)
     at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2088)
     at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806)
     at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
     at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
     at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410)
     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)
     at java.sql.DriverManager.getConnection(DriverManager.java:664)
     at java.sql.DriverManager.getConnection(DriverManager.java:208)
     at SQLConnector.Main.main(Main.java:20)
    Caused by: java.sql.SQLException: Access denied for user ''@'Freinds ip' (using password: NO)
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3970)
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906)
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:873)
     at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1710)
     at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
     at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253)
     at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2104)
     ... 13 more