3

很简单的东西,在这里——我只是对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();
    }
}

开发系统输出 (预期/正确响应)

olie$ java mysqltest
Main started.
Start of getDBConnection.
Properties set.
driver.newInstance gotten.
Connection gotten: com.mysql.jdbc.Connection@c980c9.
olie$ 

服务器输出 (我正在尝试追踪的错误)(删除了一些空白行。)

mini$ java mysqltest
Main started.
Start of getDBConnection.
Properties set.
driver.newInstance gotten.
*** Got exception.
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.ConnectException
MESSAGE: Connection refused

STACKTRACE:

java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    at java.net.Socket.connect(Socket.java:520)
    at java.net.Socket.connect(Socket.java:470)
    at java.net.Socket.<init>(Socket.java:367)
    at java.net.Socket.<init>(Socket.java:209)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
    at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771)
    at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(DriverManager.java:525)
    at java.sql.DriverManager.getConnection(DriverManager.java:140)
    at mysqltest.getDBConnection(mysqltest.java:34)
    at mysqltest.main(mysqltest.java:49)

** END NESTED EXCEPTION **

Last packet sent to the server was 3 ms ago.
    at com.mysql.jdbc.Connection.createNewIO(Connection.java:2847)
    at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(DriverManager.java:525)
    at java.sql.DriverManager.getConnection(DriverManager.java:140)
    at mysqltest.getDBConnection(mysqltest.java:34)
    at mysqltest.main(mysqltest.java:49)
mini$ 
4

8 回答 8

16

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

在我的 MySQL conf 文件中,我碰巧将BIND ADDR设置为机器的 IP。我没有将其设置为127.0.0.1, 或0.0.0.0。所以 MySQL 会接受来自外部的 JDBC 连接,但不会接受内部的 JDBC 连接。仅当从本地计算机连接时,我才收到拒绝连接。

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

希望这可以帮助那些犯了同样愚蠢错误的人。用上面关于netstat -an | grep 3306.

于 2011-04-07T05:33:43.953 回答
6

呸! 抱歉——我刚刚设置了“仅限本地连接”。我对 java 应用程序在本地运行这一事实感到困惑(所以看起来是“本地连接”,但是因为它是通过 TCP 连接的,所以它是一个“远程”连接,即使它起源于 localhost。

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

感谢所有花时间帮助我的人。从那以后我允许“远程”连接,但我所有的用户帐户都只是“用户名”@“本地主机”(,没有“用户名”@“%”,这将允许任何机器连接。)希望,至少我说对了那部分。

再次感谢!

于 2008-12-15T05:20:42.583 回答
2

此外,请确保您的 MySQL 服务器的数据库用户帐户允许来自除 localhost 之外的其他地址的连接。出于安全原因,在较小的服务器中,可以(并且可能是默认设置?)限制与 localhost 的连接,以便只有本地 Web 应用程序可以使用幻数用户/密码组合访问数据库。

于 2008-12-14T20:37:21.377 回答
1

“连接被拒绝”消息只有一个原因,不管它是 mysql 还是任何其他服务。服务器没有在听。尝试“netstat -an”和 grep 端口 3306 来验证它。

于 2008-12-14T21:16:56.040 回答
0

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

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

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

上面的属性似乎是 OS X 特有的。你是在 os X 上运行服务器吗?

于 2008-12-14T19:17:29.087 回答
0

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

于 2008-12-14T20:33:59.667 回答
0

/* 回答日期是过期,但我的回答是未来 */

我也有同样的问题。

我该如何解决?

回答:

打开您的 Xammp 或其他服务器,然后运行 ​​MYSQL...。如果 SQL 未运行,则会抛出异常。

于 2013-06-25T03:35:05.063 回答
-1

这是我在 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();
            }
    }
于 2008-12-15T04:13:19.817 回答