2012-02-14 68 views
0

有人能向我解释为什么这条线的工作原理:的SQLException:通信链路故障(Java/MySQL的)

conn = DriverManager.getConnection("jdbc:mysql://myWebsite.com:3306/schemaName?user=userX&password=passwordX"); 

但是,这行不:

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/schemaName?user=userX&password=passwordX"); 

,我收到了通信链路故障时,尝试通过本地主机(或127.0.0.1)进行访问。但是,我可以通过PHP和MySQLQuery浏览器和MySQL Aministrator通过本地主机访问数据库。

如果需要的话这里是我使用的整个方法:

public Database() throws Exception { 
Class.forName("com.mysql.jdbc.Driver").newInstance(); 

try { 
    conn = DriverManager.getConnection("jdbc:mysql://myWebsite.com:3306/schemaName?user=userX&password=passwordX"); 
    // Next line does not work. 
    // conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/schemaName?user=userX&password=passwordX"); 
    } catch (SQLException ex) { 
     displaySQLException(ex); // Seperate routine to display errors. 
    } 
} 

感谢您的帮助, 理查德

+0

做“用户X”必须从本地主机访问数据库的权限?可能是PHPandMySQl查询浏览器,MySQL管理员使用可以从本地主机访问数据库的其他用户。 – 2012-02-14 04:33:00

回答

2

可能你的mysqld是binding专门用于以太网接口而不是所有接口(0.0.0.0)或本地主机接口(127.0.0.1)。

在* nix平台,你可以检查哪些接口守护进程监听使用下面的命令:

$ netstat -ln|grep 3306 
tcp  0  0 0.0.0.0:3306    0.0.0.0:*     LISTEN 
+0

我不是那么熟悉java和/或mysql ...所以我不明白为什么这个工作,当我没有与其他应用程序的问题。 感谢所有回复。 – 2012-02-14 05:04:36

+0

@RichardRhyan其他应用程序可能使用[socket](http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_skip-networking)接口而不是tcp。 – jamesallman 2012-02-14 05:08:25

0

在第二代码:

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/schemaName? 
       user=userX&password=passwordX"); 

它将尝试连接到本地主机上的机器上的mysql(,其上的代码正在运行)。在你的情况下,你的机器上的mysql或者你正在运行代码的地方可能不可用或停止,或者你传递的usename/password是无效的,或者schemaname不存在。但是在myWebsite.com上它已经结束了。

你的代码没有错。确保mySql已安装且正在运行且用户名/密码有效,在运行此代码的计算机上存在提供了schemaname的模式,其中localhost

0

可能发生这种情况的原因有很多,像

  1. MySQL服务器可能会在目标机器上停止
  2. MySQL的可能配置不接受远程连接
  3. 防火墙可能在禁止远程连接端口3306