Java:无法连接到MySQL

时间:2010-01-22 15:41:01

标签: java sql mysql jdbc

我正在编写一个桌面java应用程序,我希望连接到服务器上的MySQL数据库。以下是执行此操作的代码:

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
        String username = "myUserName";
        String password = "myPassWord";
        String url = "jdbc:mysql://www.domainName.com:3306/databaseName";

        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Connecting to database...");

        //hangs here    
        Connection conn = DriverManager.getConnection(url, username, password);
        return conn;
    }

当我运行此功能时,它会挂起DriverManager.getConnection()电话。为什么会这样?我的网址格式错误了吗?

(我没有得到任何错误消息,但是程序没有像在无限循环中那样响应。我没有等待超过90秒来查看是否会建立连接。)

此外,Class.forName()电话的目的是什么?它是如何工作的?

我几乎完全确定用户名和密码是正确的。 (我刚才使用userNamepassWord作为占位符。)

更新:我修正了端口号,现在我收到了这个错误:

  

无法连接到数据库:java.sql.SQLException:访问被拒绝   用户'userName'@'r236059121.resnet.mySchool.edu'(使用   密码:是)

这是否意味着我需要在数据库上配置设置?或者这是否意味着我的凭证错了? (它们适用于部署在包含数据库的服务器上的PHP脚本。)

解决方案:将上面的主机添加到cPanel上的访问主机列表中。

3 个答案:

答案 0 :(得分:4)

对我来说似乎无法访问您的数据库,并且当调用进入超时时您可能会收到错误。您确定主机名和端口是否正确并且可以从您的计算机上访问?

newInstance()结束时您不需要Class.forName()Class.forName()触发类加载器加载该类,然后在驱动程序中触发一些内部注册代码,使驱动程序可用。

答案 1 :(得分:2)

我认为该行应该只是

Class.forName("com.mysql.jdbc.Driver");

(关闭.newInstance()位)

这会导致驱动程序向驱动程序管理器注册,并允许驱动程序管理器为数据库URL选择驱动程序。

我认为挂起是由DNS问题引起的,或者是导致无法访问数据库的其他原因。默认情况下,MySQL JDBC驱动程序不会超时连接。请参阅http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html并查找connectTimeout

在您的代码中,您有

  String url = "jdbc:mysql://www.domainName.com:portNumber/databaseName";

我认为你在那里使用了真正的端口?默认情况下,它应该是3306.您可以使用几乎所有mysql实例中都存在的测试数据库进行测试:

  String url = "jdbc:mysql://www.domainName.com:3306/test";

您还写道:

 String username = "myUserName";
 String password = "myPassWord";

显然你也应该在这里使用真实的凭证。问你的dba他们是什么。如果您是DBA,那么......您应该阅读MySQl管理:)严重的是,当您安装MySQL时,您可能会为root用户提供密码。使用那些(以明显的方式)

在实际代码中,当数据库不存在时,您可能不应该挂起。所以我建议添加一个connectTimeout选项,如下所示:

  String url = "jdbc:mysql://www.domainName.com:3306/test?connectTimeout=3000";

connectTimeout以毫秒为单位,因此这将在3秒后超时

答案 2 :(得分:0)

Rosarch - 您无法连接到您的数据库,因为它无法访问。 一段时间后它会超时。 尝试远程登录 -

telnet <IP-OF-domainName.com> <PortNumber>

你会发现它显示超时。

解决方案 - 1.)如果您在防火墙后面,则需要打一个洞以允许访问 2.)如果您在代理后面,需要将其配置为允许访问