3

かなり簡単なことですが、私は mysql が私に何を求めているのかを理解するのに十分ではありません。

開発システムのmysqlで接続を開く短いJavaテストケースがありますが、それをサーバーに配置しようとすると失敗します。

これを追跡するための助けをいただければ幸いです。

ありがとう!

テストコード

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ファイルで、たまたまBINDADDRをマシンのIPに設定しました。127.0.0.1、、またはに設定しませんでした0.0.0.0。したがって、MySQLは外部からのJDBC接続を受け入れますが、内部は受け入れません。ローカルマシンから接続しているときにのみ接続が拒否されました。

そのアドレスを変更して0.0.0.0、任意のIPへの要求をリッスンできるようにします。これにより、内部IPと外部IPの両方が可能になりました。

うまくいけば、これは私がしたのと同じばかげた間違いをした誰かを助けるでしょう。上記のコメントで確認してくださいnetstat -an | grep 3306

于 2011-04-07T05:33:43.953 に答える
6

ばっ!申し訳ありませんが、「ローカル接続のみ」を設定しました。Javaアプリがローカルで実行されているという事実に混乱しました(「ローカル接続」のように見えましたが、TCP経由で接続しているため、ローカルホストから発信されているにもかかわらず、「リモート」接続です.

私は最終的にこれらのことを管理する方法を学びます。それまでの間、他の誰かが私の過ちから学べることを願っています。

私を助けようと時間を割いてくれたすべての人に感謝します。それ以来、「リモート」接続を許可しましたが、すべてのユーザー アカウントは「username'@'localhost」のみです (つまり、「username'@'%' がないため、どのマシンでも接続できます)。うまくいけば、少なくとも、私はその部分を正しく理解しました。

再度、感謝します!

于 2008-12-15T05:20:42.583 に答える
2

また、データベース ユーザー用の MySQL サーバーのユーザー アカウントで、localhost 以外のアドレスからの接続が許可されていることを確認してください。小規模なサーバーではセキュリティ上の理由から、ローカル Web アプリケーションのみがマジック ナンバーのユーザー/パスワードの組み合わせを使用してデータベースにアクセスできるように、localhost への接続を制限することができます (おそらくデフォルトでしょうか?)。

于 2008-12-14T20:37:21.377 に答える
1

「接続が拒否されました」というメッセージの理由は 1 つだけです。それが mysql であるか他のサービスであるかは気にしないでください。サーバーがリッスンしていません。「netstat -an」を試し、ポート 3306 を grep して検証します。

于 2008-12-14T21:16:56.040 に答える
0

URL には localhost が含まれています。ネットワーク上のこのサーバーに接続しようとしていますか? URL が正しくない可能性があります。

于 2008-12-14T20:33:59.667 に答える
0

名前とパスワードを使用して、サーバー上のデータベースに接続できることを確認しましたか。

また、URL 経由で接続している場合は、次の行は必要ありません。

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

上記のプロパティは Os X に固有のようです。OS X でサーバーを実行していますか?

于 2008-12-14T19:17:29.087 に答える
-1

これがosXの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 に答える