Java驱动程序.getConnection()生成;“拒绝连接”;来自实时系统上的mysql,而不是开发人员

Java驱动程序.getConnection()生成;“拒绝连接”;来自实时系统上的mysql,而不是开发人员,java,mysql,jdbc,Java,Mysql,Jdbc,非常简单的东西,在这里——我只是不够好用mysql来理解它想从我这里得到什么 我有一个简短的java测试用例,可以在我的开发系统上打开mysql上的连接,但是,当我尝试将它放到我的服务器上时,它失败了 如果您能帮我查到这件事,我们将不胜感激 谢谢 测试代码 import java.util.*; import java.sql.*; public class mysqltest { static public void getDBConnection() {

非常简单的东西,在这里——我只是不够好用mysql来理解它想从我这里得到什么

我有一个简短的java测试用例,可以在我的开发系统上打开mysql上的连接,但是,当我尝试将它放到我的服务器上时,它失败了

如果您能帮我查到这件事,我们将不胜感激

谢谢

测试代码

import  java.util.*;
import  java.sql.*;

public  class   mysqltest {

    static  public  void  getDBConnection() {
        System.out.println ("Start of getDBConnection.");

        Connection  conn        = null;
        String      url         = "jdbc:mysql://localhost:3306/";
        String      dbName      = "magnets_development";
        String      driver      = "com.mysql.jdbc.Driver";
        String      userName    = "*****";  // blanked for publication
        String      password    = "*****";

        try {
            Class.forName (driver).newInstance();
            System.out.println ("driver.newInstance gotten.");
            conn = DriverManager.getConnection (url+dbName, userName, password);
            System.out.println ("Connection gotten: " + conn + ".");
            Statement sql     = conn.createStatement ();
            ResultSet results = sql.executeQuery ("use " + dbName + ";");
        }
        catch (Exception ex) {
            System.out.println ("*** Got exception.");
            ex.printStackTrace();
        }
    }

    public static void main(String args[]) {
        System.out.println ("Main started.");
        mysqltest.getDBConnection();
    }
}
开发系统输出(预期/正确响应)

服务器输出(我试图查找错误)(删除了一些空行。)

mini$java mysqltest
主电源启动。
开始getDBConnection。
属性集。
获取了driver.newInstance。
***有例外。
com.mysql.jdbc.CommunicationsException:由于基础异常导致的通信链路故障:
**开始嵌套异常**
java.net.ConnectException
消息:连接被拒绝
堆栈跟踪:
java.net.ConnectException:连接被拒绝
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
位于java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
位于java.net.socksocketimpl.connect(socksocketimpl.java:432)
位于java.net.Socket.connect(Socket.java:520)
位于java.net.Socket.connect(Socket.java:470)
位于java.net.Socket(Socket.java:367)
位于java.net.Socket(Socket.java:209)
位于com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
在com.mysql.jdbc.MysqlIO上(MysqlIO.java:271)
在com.mysql.jdbc.Connection.createNewIO上(Connection.java:2771)
位于com.mysql.jdbc.Connection(Connection.java:1555)
位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
位于java.sql.DriverManager.getConnection(DriverManager.java:525)
位于java.sql.DriverManager.getConnection(DriverManager.java:140)
在mysqltest.getDBConnection(mysqltest.java:34)
位于mysqltest.main(mysqltest.java:49)
**结束嵌套异常**
最后一个发送到服务器的数据包是3毫秒前的。
位于com.mysql.jdbc.Connection.createNewIO(Connection.java:2847)
位于com.mysql.jdbc.Connection(Connection.java:1555)
位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
位于java.sql.DriverManager.getConnection(DriverManager.java:525)
位于java.sql.DriverManager.getConnection(DriverManager.java:140)
在mysqltest.getDBConnection(mysqltest.java:34)
位于mysqltest.main(mysqltest.java:49)
迷你美元

您是否已验证可以使用名称和密码连接到服务器上的数据库

此外,如果您是通过url连接,则不需要以下行

properties.setProperty("socket", "/Applications/MAMP/tmp/mysql/mysql.sock");

上面的属性似乎特定于Os X。您是否在Os X上运行服务器?

您的URL中包含localhost。您正在尝试连接到网络上的此服务器吗?您的URL可能不正确。

此外,请确保MySQL服务器的数据库用户用户帐户允许从本地主机以外的其他地址进行连接。出于安全原因,在较小的服务器中,可以(可能是默认情况下)限制与本地主机的连接,以便只有本地web应用程序可以使用神奇编号的用户/密码组合访问数据库。

出现“连接被拒绝”消息的原因只有一个,不管是mysql还是任何其他服务。 服务器未在侦听。
尝试使用“netstat-an”和grep对端口3306进行验证。

以下是我在os X上的mysql上的代码

public SQL(String host, String port, String database, String userid, String password)
    {
        queryType = QUERYTYPE.Single;
        String driver = "org.gjt.mm.mysql.Driver";
        String url = "jdbc:mysql://" + host;
        if (port != null)
            {
                url += ":" + port;
            }
        else
            {
                url += ":" + defaultPort;
            }
        url += "/" + database;
        try
            {
                Class.forName(driver);

                connection = DriverManager.getConnection(url, userid, password);
            }
        catch (Exception e)
            {
                e.printStackTrace();
            }
    }
呸!我很抱歉,我刚刚设置了“仅本地连接”。java应用程序在本地运行(因此看起来是“本地连接”),但由于它是通过TCP连接的,所以它是一个“远程”连接,即使它起源于本地主机,这一事实让我感到困惑

我最终会学会如何管理这些事情。同时,我希望其他人能从我的错误中吸取教训

感谢所有花时间帮助我的人。我已经允许了“远程”连接,但我所有的用户帐户都只是“用户名”@“本地主机”(即,没有“用户名”@“%”,这将允许任何机器连接)。希望我至少正确地完成了这一部分


再次感谢!

这只是一个关于这个主题的有用说明。我花了至少30分钟试图调试同一个错误,这是我的错误

在我的MySQL配置文件中,我碰巧将BIND ADDR设置为机器的IP。我没有将其设置为
127.0.0.1
,或
0.0.0
。因此MySQL将接受外部的JDBC连接,而不是内部的。只有从本地机器连接时,我才被拒绝连接

将该地址更改为
0.0.0.0
允许它侦听对任何IP的请求。这允许内部和外部IP


希望这能帮助那些犯了我犯过的同样愚蠢错误的人。用上面关于
netstat-an | grep3306

/*的评论检查一下,答案日期已经过期,但我的答案是将来的*/

我也有同样的问题

我怎样才能解决它

答复:

打开您的Xammp或其他服务器, 只要运行MYSQL。。。 .
如果SQL没有运行,则会引发异常。

是的,我可以使用所述用户名和密码从命令行连接到mysql。是的,服务器在OS-X上(就像我的开发系统一样——所有版本的java、OSX、mysql都是相同的)。您正确地看到,设置的属性“socket”"对应用程序是否运行没有影响。好的,netstat-an | grep 3306不返回任何内容——因此这是朝着正确方向迈出的一步。嗯……mysql显然正在运行。我可以从命令行登录。我认为有一些配置的东西可以打开3306侦听…?您是从同一台机器上的命令行登录还是从另一台机器上登录感谢uzhin(很荣幸地提到Uri)给我的提示,我最终找到了t
properties.setProperty("socket", "/Applications/MAMP/tmp/mysql/mysql.sock");
public SQL(String host, String port, String database, String userid, String password)
    {
        queryType = QUERYTYPE.Single;
        String driver = "org.gjt.mm.mysql.Driver";
        String url = "jdbc:mysql://" + host;
        if (port != null)
            {
                url += ":" + port;
            }
        else
            {
                url += ":" + defaultPort;
            }
        url += "/" + database;
        try
            {
                Class.forName(driver);

                connection = DriverManager.getConnection(url, userid, password);
            }
        catch (Exception e)
            {
                e.printStackTrace();
            }
    }