Error connecting MySQL databases in Android app: Communications link failure

38 Views Asked by At

I'm trying to connect the MySQL database to Android Studio, and I'm encountering an error.

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
 W  com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
 W  
 W  The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
 W      at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
 W      at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
 W      at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:815)
 W      at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:438)
 W      at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241)
 W      at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:189)
 W      at java.sql.DriverManager.getConnection(DriverManager.java:580)
 W      at java.sql.DriverManager.getConnection(DriverManager.java:218)
 W      at com.example.drivingschool.DatabaseHandler.getDbConnection(DatabaseHandler.java:18)
 W      at com.example.drivingschool.DatabaseHandler.getUser(DatabaseHandler.java:35)
 W      at com.example.drivingschool.MainActivity$LoginTask.doInBackground(MainActivity.java:98)
 W      at com.example.drivingschool.MainActivity$LoginTask.doInBackground(MainActivity.java:87)
 W      at android.os.AsyncTask$3.call(AsyncTask.java:394)
 W      at java.util.concurrent.FutureTask.run(FutureTask.java:264)
 W      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
 W      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 W      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
 W      at java.lang.Thread.run(Thread.java:1012)
 W  Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
 W  
 W  The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
 W      at java.lang.reflect.Constructor.newInstance0(Native Method)
 W      at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
 W      at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
 W      at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:104)
 W      at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:149)
 W      at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:165)
 W      at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:88)
 W      at com.mysql.cj.NativeSession.connect(NativeSession.java:120)
 W      at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:935)
 W      at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:805)
 W      ... 15 more
 W  Caused by: java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 3306) from /:: (port 51300): connect failed: ECONNREFUSED (Connection refused)
 W      at libcore.io.IoBridge.connect(IoBridge.java:187)
 W      at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
 W      at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
 W      at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
 W      at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
 W      at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
 W      at java.net.Socket.connect(Socket.java:646)
 W      at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153)
 W      at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:62)
 W      ... 18 more
 W  Caused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
 W      at libcore.io.Linux.connect(Native Method)
 W      at libcore.io.ForwardingOs.connect(ForwardingOs.java:201)
 W      at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:158)
 W      at libcore.io.ForwardingOs.connect(ForwardingOs.java:201)
 W      at libcore.io.IoBridge.connectErrno(IoBridge.java:201)
 W      at libcore.io.IoBridge.connect(IoBridge.java:179)
 W      ... 26 more

My connection config that I used:

public class config {
    protected String dbHost = "localhost";
    protected String dbPort = "3306";
    protected String dbUser = "root";
    protected String dbPass = "****";
    protected String dbName = "drivingschooldb";

}

databasehandler I used to connect to my database:

package com.example.drivingschool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;

public class DatabaseHandler extends config{
    Connection dbConnection;

    public Connection getDbConnection() throws ClassNotFoundException, SQLException {
        String connectionString = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName;

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

        try {
            dbConnection = DriverManager.getConnection(connectionString, dbUser, dbPass);
            System.out.println("Подключение к базе данных успешно установлено");
        } catch (SQLException e) {
            System.out.println("Ошибка при подключении к базе данных: " + e.getMessage());
            throw e;
        }

        return dbConnection;
    }

    //войти в приложение
    public ResultSet getUser(User user) {
        ResultSet resSet = null;

        String select = "SELECT * FROM " + constant.USER_TABLE + " WHERE " + constant.USERS_LOGIN + "=? AND " + constant.USERS_PASSWORD + "=?";

        try {
            PreparedStatement prSt = getDbConnection().prepareStatement(select);
            prSt.setString(1, user.getLogin());
            prSt.setString(2, user.getPassword());

            resSet = prSt.executeQuery();
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (dbConnection != null) {
                try {
                    dbConnection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        return resSet;
    }
}

I used mysql-connector-j-8.3.0 here to connect to the database and also installed a class for the driver.Also, I use MySQL Workbench 8.0. I connected all the libraries and installed this library in the gradle. Also my MainActivity class, where the connection should have taken place:

    // Class for performing a network operation in the background
    class LoginTask extends AsyncTask<String, Void, Boolean> {
        private Exception exception;

        protected Boolean doInBackground(String... params) {
            // Получение логина и пароля из параметров
            String username = params[0];
            String password = params[1];

            // Попытка входа в систему с помощью базы данных
            try {
                DatabaseHandler dbHandler = new DatabaseHandler(); // Создание экземпляра DatabaseHandler
                ResultSet resSet = dbHandler.getUser(new User(username, password)); // Использование экземпляра для вызова метода getUser

                if (resSet != null && resSet.next()) {
                    // Успешный вход в систему
                    return true;
                } else {
                    // Неверные учетные данные
                    return false;
                }
            } catch (SQLException e) {
                this.exception = e;
                return false;
            }
        }

        protected void onPostExecute(Boolean result) {
            // Этот метод запускается в основном потоке после завершения фоновой задачи
            if (result) {
                // Успешный вход в систему
                Toast.makeText(MainActivity.this, "Авторизация успешна!", Toast.LENGTH_SHORT).show();
                // Создание намерения для перехода на новую страницу
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                // Запуск намерения
                startActivity(intent);
                finish(); // Завершить текущую активность
            } else {
                if (this.exception != null) {
                    // Было исключение с базой данных
                    Toast.makeText(MainActivity.this, "Ошибка базы данных: " + this.exception.getMessage(), Toast.LENGTH_SHORT).show();
                } else {
                    // Неверные учетные данные
                    Toast.makeText(MainActivity.this, "Неверный логин или пароль" , Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
}

I tried changing bind-address in my.ini, to my IPv4 Address and to 0.0.0.0 (to no avail). I also have my firewall turned off, so there shouldn't be any issues with it. Perhaps the problem is in the link to the connection itself, but in the DB Navigator plugin, the connection works fine using the same link. Or perhaps the error lies elsewhere, but these methods did not bring results.

0

There are 0 best solutions below