0

I'm trying to create a simple application that executes a SQL query to retrieve data from a local MySQL database. I'm using Android Studio, and an emulator. I've switched my URL to call my ip address, I'm not using 'localhost'. The app seems like it's trying to connect to the database but then I get thrown the System err:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Below is my Java code.

package com.example.mysqlexampleproject;

import android.content.Context;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedHashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

ItemAdapter itemAdapter;
Context thisContext;
ListView myListView;
TextView progressTextView;
Map<String, Double> fruitsMap = new LinkedHashMap<String, Double>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Resources res = getResources();
    myListView = findViewById(R.id.myListView);
    progressTextView = findViewById(R.id.progressTextView);
    thisContext = this;

    // Clear out the progressTextView
    progressTextView.setText("");

    // getDataButton setup
    Button btn = findViewById(R.id.getDataButton);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            GetData retrieveData = new GetData();
            retrieveData.execute("");
        }
    });
}

private class GetData extends AsyncTask<String, String, String> {

    String msg = "";
    // JDBC driver name and database url
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";

    @Override
    protected void onPreExecute() {
        progressTextView.setText("Connecting to Database...");
    }

    @Override
    protected String doInBackground(String... strings) {

        Connection conn = null;
        Statement stmt = null;

        try {

            Class.forName(JDBC_DRIVER);

            // Connect to Database
            conn = DriverManager.getConnection("jdbc:mysql://10.0.0.238:3306/example", "****", "********");

            // Statement setup
            stmt = conn.createStatement();
            String sql = "SELECT * FROM fruits";

            ResultSet rs = stmt.executeQuery(sql);

            while (rs.next()) {
                System.out.println(rs.getString("name") + " , " + rs.getString("price"));
                String name = rs.getString("name");
                double price = rs.getDouble("price");
                fruitsMap.put(name, price);
            }

            msg = "Process complete.";

            // Close open resources
            rs.close();
            stmt.close();
            conn.close();

        } catch (SQLException connError) {

            msg = "An exception was thrown for JDBC.";
            connError.printStackTrace();

        } catch (ClassNotFoundException e) {

            // Will display if line 77 has error
            msg = "A class not found exception was thrown.";
            e.printStackTrace();

        }   finally {

            // Close stmt if left open

            try {

                if (stmt != null)
                    stmt.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

            // Close conn if left open
            try {

                if (conn != null)
                    conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String msg) {

        progressTextView.setText(this.msg);

        if (fruitsMap.size() > 0) {
            itemAdapter = new ItemAdapter(thisContext, fruitsMap);
            myListView.setAdapter(itemAdapter);
        }
    }
}

} // End of MainActivity

Some other fixes I've tried were disabling my firewall to see if that was causing some issues. I've also checked to see if I could connect to my database with simple Java using Eclipse, which it does. So I'm not sure why I can connect to it using Eclipse. I've also tried accessing the database using MySQL root user as well as an admin user. Any other thoughts?

Here's the stack trace

    W/System.err: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    W/System.err:     
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)
    W/System.err:     
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:335)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2187)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2220)

W/System.err:     
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2015)

W/System.err:     
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:768)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)

W/System.err:     
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385)

W/System.err:     
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:323)
at java.sql.DriverManager.getConnection(DriverManager.java:569)
at java.sql.DriverManager.getConnection(DriverManager.java:219)

W/System.err:     
at com.example.mysqlexampleproject.MainActivity$GetData.doInBackground(MainActivity.java:77)    
at com.example.mysqlexampleproject.MainActivity$GetData.doInBackground(MainActivity.java:55)    
at android.os.AsyncTask$2.call(AsyncTask.java:333)    
at java.util.concurrent.FutureTask.run(FutureTask.java:266)

W/System.err:     

at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)

W/System.err: 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)

Caused by: java.net.ConnectException: failed to connect to /10.0.0.238 (port 3306) from /:: (port 56770): connect failed: ECONNREFUSED (Connection refused)

at libcore.io.IoBridge.connect(IoBridge.java:137)

W/System.err:     
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:137)

W/System.err:     
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)    
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)

W/System.err:     
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:621)

W/System.err:     
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:211)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:299)

W/System.err:   ... 20 more
    Caused by: android.system.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
        at libcore.io.Linux.connect(Native Method)
        at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:118)
    W/System.err:     at libcore.io.IoBridge.connectErrno(IoBridge.java:151)
        at libcore.io.IoBridge.connect(IoBridge.java:129)
        ... 28 more
halfer
  • 19,824
  • 17
  • 99
  • 186

0 Answers0