Java Driver.getConnection () выдает «Отказано в соединении» из mysql на работающей системе, а не dev - PullRequest
4 голосов
/ 14 декабря 2008

Здесь довольно простые вещи - я просто недостаточно хорош в 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();
    }
}

Выход системы Dev (ожидаемый / правильный ответ)

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$ 

Ответы [ 8 ]

16 голосов
/ 07 апреля 2011

Просто полезная заметка на эту тему. Я потратил не менее 30 минут, пытаясь отладить ту же ошибку, и это была моя ошибка.

В моем файле конфигурации MySQL я установил BIND ADDR на IP-адрес компьютера. Я не установил его на 127.0.0.1 или 0.0.0.0. Таким образом, MySQL будет принимать соединения JDBC извне, но не изнутри. Я получал отказ в соединении только при подключении с локальной машины.

Изменение этого адреса на 0.0.0.0 позволило ему прослушивать запросы на любой IP. Это позволило для внутренних и внешних IP-адресов.

Надеюсь, это поможет кому-то, кто совершил ту же глупую ошибку, что и я. Проверьте это с приведенным выше комментарием о netstat -an | grep 3306.

6 голосов
/ 15 декабря 2008

Ба! Мои извинения - я только что настроил "только локальные соединения". Я был смущен тем фактом, что Java-приложение работало локально (поэтому казалось, что это «локальное соединение», но, поскольку оно соединяется через TCP, это «удаленное» соединение, даже если оно происходит на локальном хосте.

Я со временем научусь управлять этими вещами. В то же время, я надеюсь, что кто-то еще сможет учиться на моих ошибках.

Спасибо всем, кто уделил время попыткам помочь мне. С тех пор я разрешил «удаленные» подключения, но все мои учетные записи пользователей являются «username» @ «localhost» только ( т.е. , нет «username» @ «%», что позволило бы любой машине подключиться.) Надеюсь, я правильно понял эту часть, по крайней мере.

Еще раз спасибо!

2 голосов
/ 14 декабря 2008

Кроме того, убедитесь, что учетная запись пользователя вашего сервера MySQL для пользователя базы данных разрешает соединения с других адресов, кроме localhost. По соображениям безопасности на небольших серверах можно (и, возможно, по умолчанию?) Ограничить подключения к localhost, чтобы только локальное веб-приложение могло получить доступ к базе данных, используя комбинацию пользователя и пароля с волшебным номером.

1 голос
/ 15 декабря 2008

Есть только одна причина для сообщения «отказано в соединении», не говоря уже о том, является ли это mysql или любым другим сервисом. Сервер не слушает. Попробуйте "netstat -an" и grep для порта 3306, чтобы проверить его.

0 голосов
/ 25 июня 2013

/ * дата ответа истекает, но мой ответ для будущего * /

У меня та же проблема.

Как я могу это решить?

Ответ:

Откройте свой Xammp или другой сервер, и просто запустите MYSQL ... , Если SQL не запущен, это исключение выдаст.

0 голосов
/ 15 декабря 2008

Вот мой код, который работает на MySQL на ОС X

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();
            }
    }
0 голосов
/ 14 декабря 2008

Ваш URL содержит localhost. Вы пытаетесь подключиться к этому серверу в сети? Ваш URL может быть неправильным.

0 голосов
/ 14 декабря 2008

Вы убедились, что можете подключиться к базе данных на сервере, указав имя и пароль.

Также, если вы подключаетесь через URL, вам не нужна следующая строка.

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

Указанное выше свойство относится только к Os X. Вы работаете на сервере под OS X?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...