Java: проблема с подключением к MySQL - PullRequest
2 голосов
/ 22 января 2010

Я пишу настольное Java-приложение, которое хочу подключить к базе данных MySQL на сервере.Вот код для этого:

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
        String username = "myUserName";
        String password = "myPassWord";
        String url = "jdbc:mysql://www.domainName.com:3306/databaseName";

        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Connecting to database...");

        //hangs here    
        Connection conn = DriverManager.getConnection(url, username, password);
        return conn;
    }

Когда я запускаю это, он зависает при вызове DriverManager.getConnection().Почему это происходит?Неправильный ли мой URL-адрес?

(Я не получаю никаких сообщений об ошибках, но программа не отвечает, как в бесконечном цикле. Я не ждал более 90 секунд, чтобы увидеть, будет ли соединениекогда-либо быть установленным.)

Кроме того, какова цель вызова Class.forName()?Как это работает?

Я почти полностью уверен, что имя пользователя и пароль верны.(Я просто использовал userName и passWord в качестве заполнителей выше.)

ОБНОВЛЕНИЕ : я исправил номер порта, и теперь я получаю эту ошибку:

Невозможно подключиться к базе данных: java.sql.SQLException: доступ запрещен для пользователя 'userName'@'r236059121.resnet.mySchool.edu' (с использованием пароля: ДА)

Означает ли это, что мне нужнонастроить параметры в базе данных?Или это означает, что у меня неверные учетные данные?(Они работают для сценариев PHP, развернутых на сервере, который содержит базу данных.)

РЕШЕНИЕ : добавленный выше хост в список хостов доступа на cPanel.

Ответы [ 3 ]

4 голосов
/ 22 января 2010

Мне кажется, что ваша база данных недоступна, и вы, вероятно, получите сообщение об ошибке, когда вызов истечет время ожидания. Вы уверены, что имя хоста и порт правильны и доступны с вашей машины?

Вам не нужно newInstance() в конце Class.forName(). Class.forName() запускает загрузчик классов для загрузки этого класса, который, в свою очередь, запускает некоторый внутренний регистрационный код в драйвере, который делает драйвер доступным.

2 голосов
/ 22 января 2010

Я думаю, что строка должна быть

Class.forName("com.mysql.jdbc.Driver");

(закрыть бит .newInstance())

Это заставляет драйвер зарегистрироваться в диспетчере драйверов и позволяет диспетчеру драйверов выбирать драйвер для URL базы данных.

Я думаю, что зависание вызвано проблемой DNS или другой причиной, по которой ваш db не может быть достигнут. По умолчанию драйвер MySQL JDBC не устанавливает время ожидания для соединения. Смотрите http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html и ищите connectTimeout.

В вашем коде у вас есть

  String url = "jdbc:mysql://www.domainName.com:portNumber/databaseName";

Я так понимаю, вы использовали реальный порт там? По умолчанию это должно быть 3306. Вы можете проверить с тестовой базой данных, которая присутствует практически во всех случаях mysql:

  String url = "jdbc:mysql://www.domainName.com:3306/test";

Вы также написали:

 String username = "myUserName";
 String password = "myPassWord";

Очевидно, вам также следует использовать настоящие учетные данные. Спросите своего дба, кто они. Если вы администратор базы данных, то ... ну, вы, вероятно, должны прочитать об администрировании MySQl :) Серьезно, когда вы устанавливали MySQL, вам, вероятно, предлагали ввести пароль для пользователя root. Используйте их (очевидным образом)

В реальном коде вы, вероятно, не должны зависать, когда нет базы данных. Поэтому я советую добавить опцию connectTimeout примерно так:

  String url = "jdbc:mysql://www.domainName.com:3306/test?connectTimeout=3000";

(connectTimeout в миллисекундах, поэтому время ожидания истечет через 3 секунды)

0 голосов
/ 22 января 2010

Rosarch - Вы не можете подключиться к своей БД, поскольку она недоступна. Через некоторое время это прекратится. Попробуй телнеттинг -

telnet <IP-OF-domainName.com> <PortNumber>

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

Решения - 1.) Если вы находитесь за брандмауэром, вам нужно пробить дыру, чтобы разрешить доступ 2.) Если вы находитесь за прокси-сервером, необходимо настроить его, чтобы разрешить доступ

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