Доступ запрещен к MySQL, невозможно создать соединение с сервером базы данных - PullRequest
0 голосов
/ 03 июля 2019

При настройке проекта с открытым исходным кодом возникла проблема при попытке подключения приложения к базе данных MySQL, работающей локально. После выяснения некоторых несовместимостей из-за некоторых изменений, внесенных MySQL 8.0, соединение не может быть создано, даже если детали верны, и у пользователя есть все привилегии, попробовав и с root, и с другими созданными вручную пользователями с привилегиями, назначенными вручную. Класс My SQL Manager выглядит следующим образом.

public class MySqlManager {
    private static PoolingDataSource<PoolableConnection> dataSource;

    private static int minIdle;
    private static int maxIdle;

    public static void initialize()
            throws ClassNotFoundException, SQLException, IllegalArgumentException {
        minIdle = Configuration.getInt("mysql.idle.min");
        maxIdle = Configuration.getInt("mysql.idle.max");

        if (minIdle < 0) {
            throw new IllegalArgumentException(Localization.get("mysql.error.pool"));
        }

        System.out.println("Host: " + Configuration.get("mysql.host"));
        System.out.println("Port: " + Configuration.get("mysql.port"));
        System.out.println("User: " + Configuration.get("mysql.user"));
        System.out.println("Pass: " + Configuration.get("mysql.pass"));

        // Load JDBC Driver. ClassNotFoundException may be thrown.
        Class.forName("com.mysql.cj.jdbc.Driver");

        // jdbc:mysql://host:port/database/?args
        String url = "jdbc:mysql://" +
                Configuration.get("mysql.host") + ":" +
                Configuration.get("mysql.port") + "/" +
                Configuration.get("mysql.database") + "?" +
                "zeroDateTimeBehavior=CONVERT_TO_NULL" + "&" +
                "autoReconnect=true";

        System.out.println("URL: " + url);

        setupDataSource(url, Configuration.get("mysql.user"), Configuration.get("mysql.pass"));

        // Check if the connection with the database is working, otherwise SQLException is thrown
        try (Connection con = getConnection()) {
            if (con == null) {
                throw new RuntimeException("Retrieved dataSource connection is null.");
            }
        }
    }

    private static void setupDataSource(String url, String user, String password) {
        PoolableConnectionFactory factory = new PoolableConnectionFactory(
                new DriverManagerConnectionFactory(url, user, password), null);

        GenericObjectPoolConfig config = new GenericObjectPoolConfig();
        config.setMaxTotal(maxIdle);
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);

        ObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(factory, config);

        factory.setPool(connectionPool);

        dataSource = new PoolingDataSource<>(connectionPool);
    }

    static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    private MySqlManager() {}
}

Сообщение об ошибке показывает Could not create connection to database server. Attempted reconnect 3 times. Giving up.

Версии платформы включают MySQL 8.0.16, DBCP 2.6.0, MySQL-Connector-Java 8.0.16. Подтверждение привилегий для указанного пользователя выглядит следующим образом.

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `joao`@`localhost` WITH GRANT OPTION;
GRANT APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `joao`@`localhost` WITH GRANT OPTION;
...