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

时间:2017-01-06 17:14:46

标签: 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";
        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);
        }
    }
}

这是我的朋友,即客户的错误:

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

请帮我查一下我的连接服务器的方法有什么问题,我已远程授予我朋友的权限(用户“bob”)。

1 个答案:

答案 0 :(得分:0)

因此,您有以下错误:

  

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败java.net.ConnectException:Connection   拒绝

这可能由于各种原因而发生,我引用this answer

  

如果您获得SQLException: Connection refusedConnection timed out   或特定于MySQL的CommunicationsException:通信链接   失败,那就意味着数据库根本无法访问。

     

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

     
      
  1. JDBC URL中的IP地址或主机名错误。
  2.   
  3. 本地DNS服务器无法识别JDBC URL中的主机名。
  4.   
  5. JDBC URL中缺少或错误端口号。 [假设你提到的那个是正确的]
  6.   
  7. 数据库服务器已关闭。
  8.   
  9. 数据库服务器不接受TCP / IP连接。
  10.   
  11. 数据库服务器已用完连接。
  12.   
  13. Java和DB之间的某些东西阻止了连接,例如防火墙或代理。
  14.         

    要解决其中一个问题,请遵循以下建议:

         
        
    1. 使用ping验证并测试它们。
    2.   
    3. 刷新DNS或在JDBC URL中使用IP地址。
    4.   
    5. 根据MySQL DB的my.cnf进行验证。
    6.   
    7. 启动数据库。
    8.   
    9. 验证mysqld是否在没有--skip-networking选项的情况下启动。
    10.   
    11. 重新启动数据库并相应地修改代码,以便最终关闭连接。
    12.   
    13. 禁用防火墙和/或配置
    14.   
    15. 防火墙/代理允许/转发端口。
    16.