Вопрос или проблема
У меня проблемы с Glassfish 4.1 при подключении к базе данных MySQL. Я проверил, что можно войти в базу данных под пользователем root и с паролем. Когда веб-приложение вызывается, Glassfish постоянно сообщает:
java.sql.SQLException: Ошибка при выделении соединения. Причина: Соединение не может быть выделено, так как: ДоступDenied для пользователя 'root'@'localhost'
Я написал небольшое приложение, которое должно протестировать, может ли Java успешно подключиться к MySQL, прежде чем я смогу продолжить поиск ошибок. Мой вопрос: как мне добавить mysql-connector-j-8.0.33.jar (/home/glassfish/glassfish4/glassfish/lib/mysql-connector-j-8.0.33.jar) в путь пользователя перед выполнением приложения, которое будет ссылаться на драйвер для подключения к базе данных MySQL? Должен ли я сделать что-то вроде этого, что не работает:
# МОДУЛЬ MYSQL НА ПУТИ
export MSQLCONNECTOR_HOME=/home/glassfish/glassfish4/glassfish/lib
echo $MSQLCONNECTOR_HOME
# установить глобальную переменную PATH ПРОБЕЛ АДД *_HOME
export PATH=$PATH:$JAVA_HOME/bin:MSQLCONNECTOR_HOME
Извините за то, что не взаимодействовал по этой проблеме, она все еще не решена с моей стороны, нужно было заняться другой работой. У меня по-прежнему та же проблема после создания другого пользователя специально для базы данных и выполнения запросов с его помощью.
Создание пользователя было выполнено следующим образом:
CREATE USER 'dbUser'@'localhost' IDENTIFIED BY 'dbUserPWD';
GRANT SELECT, INSERT, UPDATE, DELETE ON test_db.* TO 'dbUser'@'localhost';
Строка подключения выглядит следующим образом:
jdbc:mysql://127.0.0.1:3306/test_db?zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
даже это все еще приводит к пустому соединению. Я запускаю это в Windows из исполняемого jar для тестирования кода, и оно работает без проблем. Буду признателен за любые предложения.
Сообщение об ошибке, которое вы приводите
Access denied for user 'root'@'localhost'
Происходит из MySQL, так что драйвер правильно загружен и соединение установлено, но доступ отклонен (или скорее, не предоставлен пользователю root
с localhost). Вы можете проверить свойства соединения и/или URL JDBC, который вы используете. Пользователь root
звучит так, как будто вы запускаете MySQL под пользователем root
в Linux, можете подтвердить или вы пытаетесь подключиться к MySQL под пользователем root
? (Оба являются плохой практикой, вам не следует использовать пользователя root для запуска ваших приложений/процессов – если это не явно требуется, и мы скажем – и/или не использовать пользователя root MySQL для доступа к вашей БД).
Ответ или решение
Для решения проблемы с подключением вашего Java-приложения к базе данных MySQL через Glassfish 4.1, давайте разберем несколько аспектов, включая настройки окружения, подключения и безопасность.
Шаг 1: Убедитесь, что драйвер MySQL Connector/J доступен
Для подключения к базе данных MySQL вам необходимо убедиться, что драйвер mysql-connector-j-8.0.33.jar
находится в CLASSPATH
вашего приложения. Если вы пытаетесь установить драйвер в переменную PATH, учтите, что это не является правильным подходом, так как PATH используется для исполняемых файлов, а не для библиотек Java.
Вместо этого добавьте JDBC-драйвер в CLASSPATH перед запуском вашего приложения. Например, вы можете использовать следующую команду:
export CLASSPATH=$CLASSPATH:/home/glassfish/glassfish4/glassfish/lib/mysql-connector-j-8.0.33.jar
Вы можете проверить, добавлен ли драйвер правильно:
echo $CLASSPATH
Шаг 2: Проверьте настройки базы данных
Ошибки, связанные со входом в MySQL, такие как Access denied for user 'root'@'localhost'
, указывают на проблемы с правами пользователя или неверные учетные данные. Я настоятельно рекомендую создать нового пользователя для вашей базы данных, как вы уже сделали, но убедитесь, что права доступа настроены правильно.
Для пользователя dbUser
, который вы создали, выполните следующие шаги:
CREATE USER 'dbUser'@'localhost' IDENTIFIED BY 'dbUserPWD';
GRANT ALL PRIVILEGES ON test_db.* TO 'dbUser'@'localhost';
FLUSH PRIVILEGES;
Это позволит пользователю dbUser
полностью управлять базой данных test_db
.
Шаг 3: Проверьте строку подключения
Убедитесь, что ваша строка подключения сформирована правильно. Ваша строка выглядит хорошо:
jdbc:mysql://127.0.0.1:3306/test_db?zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
Однако замените 127.0.0.1
на localhost
, чтобы удостовериться, что ваш сервер MySQL принимает соединения именно с этого хоста. Строка подключения должна выглядеть так:
jdbc:mysql://localhost:3306/test_db?zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
Шаг 4: Проверка подключения из Java
Убедитесь, что ваш Java-код для подключения к базе данных выглядит примерно так:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnector {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test_db?zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true";
String user = "dbUser";
String password = "dbUserPWD";
try (Connection connection = DriverManager.getConnection(url, user, password)) {
System.out.println("Соединение успешно установлено.");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("Ошибка соединения: " + e.getMessage());
}
}
}
Шаг 5: Дополнительные проверки
- Убедитесь, что сервер MySQL запущен и доступен для соединений.
- Проверьте файл конфигурации MySQL (
my.cnf
илиmy.ini
) на наличие ограничений по доступу. - Убедитесь, что брандмауэр (if applicable) не блокирует порты.
Следуя этим шагам, вы сможете успешно подключиться к вашей базе данных MySQL из вашего Java-приложения. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать.