我正在编写一个桌面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()
电话的目的是什么?它是如何工作的?
我几乎完全确定用户名和密码是正确的。 (我刚才使用userName
和passWord
作为占位符。)
更新:我修正了端口号,现在我收到了这个错误:
无法连接到数据库:java.sql.SQLException:访问被拒绝 用户'userName'@'r236059121.resnet.mySchool.edu'(使用 密码:是)
这是否意味着我需要在数据库上配置设置?或者这是否意味着我的凭证错了? (它们适用于部署在包含数据库的服务器上的PHP脚本。)
解决方案:将上面的主机添加到cPanel上的访问主机列表中。
答案 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.)如果您在代理后面,需要将其配置为允许访问