【问题标题】:Accessing online database with Java [duplicate]使用 Java 访问在线数据库 [重复]
【发布时间】:2012-05-03 20:21:38
【问题描述】:

我制作了一个访问数据库的 Java 程序。在开发阶段,我使用了一个本地数据库(XAMPP 和 MySQL),但是当我尝试访问 2 个不同的 online 数据库(一个商业数据库和一个免费数据库)时,我在这两种情况下都收到了以下异常:

SQLException:通信链路故障
最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动没有收到服务器发来的任何数据包。

我用 PHP 访问它们没有任何问题。

这是我的代码:

private String user = "user1";
private String pass = "pass1";
private String dbClass = "com.mysql.jdbc.Driver";
private String dbDriver = "jdbc:mysql://db4free.net:3306/DBNAME";
private Connection conn = null;

public boolean connect() {
    boolean done = false;
    //load driver
    try {
        Class.forName(dbClass).newInstance();
        System.out.println("driver loaded"); // THIS IS BEING RETURNED
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
        System.err.println(ex);
    }
    // Connection
    try {
        conn = DriverManager.getConnection(dbDriver, user, pass);
        System.out.println("connected"); // THIS IS NOT BEING RETURNED
        done = true;
    } catch (SQLException ex) {
        System.out.println("SQLException: " + ex.getMessage());
    }
    return done;
}

【问题讨论】:

  • 我怎么知道?
  • 先尝试从命令行mysql客户端连接;看看你能不能达到它。
  • 我看不出代码有问题。很可能是数据库周围的服务器配置问题。
  • 尝试从命令行连接到数据库,使用 telnet 或者最好是客户端。
  • 您可以使用 MySQL 客户端,但如果您连接成功,我会感到惊讶。值得保护的数据应该位于两道防火墙之后,而不仅仅是一道。

标签: java mysql database


【解决方案1】:

MySQL 数据库不仅允许用户使用特定密码进行连接,还允许从 IP 范围或地址进行连接。

http://dev.mysql.com/doc/refman/5.1/en/create-user.html

CREATE USER 'jeffrey'@'127.0.0.1' IDENTIFIED BY 'mypass';

因此,在线数据库可能不允许该用户从您的 IP 地址连接或阻止。

【讨论】:

    【解决方案2】:

    您的代码中没有提到端口号。这是工作代码的示例。

      try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                System.out.println(" Unable to load driver. ");
            }
            String url = "jdbc:mysql://DBSERVERNAME:3306/DATABASENAME";
            String username = "user";
            String password = "pass";
            try {
                this.conn = DriverManager.getConnection(url, username, password);
                 System.out.println(" Connection Established. ");
            } catch (SQLException e) {
                System.out.println(" Error connecting to database:  "
                        + e);
            }
    

    但是,此问题可能有多种原因。

    • 如果主机(运行此代码的机器)有权访问 MySQL 服务器,请检查您的 MySQL 服务器设置?
    • 验证 JDBC URL,检查端口号、IP 地址/主机名
    • 检查是否有任何东西(如防火墙、代理)阻止从主机到数据库服务器的连接
    • 尝试从主机 ping 数据库服务器

    类似帖子:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure

    【讨论】:

      【解决方案3】:

      您的代码在我在 db4free 新创建的帐户上运行良好:

      检查以下事项:

      Should show either your public ip or a single %

      Your username and password is correct, will also verify your account is confirmed.

      确认“DBNAME”正确,登录db4free.net上的“phpMyAdmin-Login:”,DBNAME 将在“information_schema”上方的左侧

      最后,您的本地防火墙不会阻止您:

      telnet db4free.net 3306 (from a command line/prompt)
      

      (如果您收到提示,您的防火墙会让您通过。)

      【讨论】:

      • Could not open connection to the host, on port 3306: Connect failed是不是因为我的防火墙?
      • 有可能,但我怎么知道?不管怎样,现在你知道了。
      • 所以无法确保我的软件可以在大多数机器上运行?即使它是无害的并且只是尝试连接到一个简单的数据库,防火墙会/可能会阻止它吗?
      • 我不确定我是否完全理解你。当然,防火墙可以阻止端口 3306 上的传出流量 - 没有多少开发机器会 - 或者我不知道。老实说,如果您要问的话,我真的不知道默认防火墙在 Windows 操作系统上的作用。
      【解决方案4】:

      我认为可能是防火墙问题,通常服务器可能正在监听127.0.0.1 ip地址,所以你只能从本地系统访问我的sql,在配置文件中将其更改为0.0.0.0,然后它将开始工作。

      【讨论】:

        【解决方案5】:
        static private String user = "ajaykakkar";
        static private String pass = "ajaykakkar7432";
        static private String dbClass = "com.mysql.jdbc.Driver";
        

        //它的- - - "jdbc:mysql://www.db4free.net:3306/yourdatabasename_ark";

        static private String dbDriver = "jdbc:mysql://www.db4free.net:3306/yourdatabasename_ark";
        static private Connection conn = null;
        
        public static boolean connect() {
            boolean done = false;
            //load driver
            try {
                Class.forName(dbClass).newInstance();
                System.out.println("driver loaded"); // THIS IS BEING RETURNED
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
                System.err.println(ex);
            }
            // Connection
            try {
                conn = DriverManager.getConnection(dbDriver, user, pass);
                System.out.println("connected"); // THIS IS NOT BEING RETURNED
                done = true;
            } catch (SQLException ex) {
                System.out.println("SQLException: " + ex.getMessage());
            }
            return done;
        }
        
        public static void main(String args[]) {
        
            connect();
        
        }
        

        // 由@ajay.r.kakkar 完成

        【讨论】:

        • 通常会添加一些关于您如何以及为什么解决问题的解释。
        • 你真的在答案底部签名了吗? ?
        猜你喜欢
        • 2017-01-15
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多