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