添加了mysql-connector,但连接仍在继续

时间:2019-05-08 18:18:34

标签: java android mysql

我尝试将查询发送到android studio中的数据库,几年前我用eclipse进行了管理,但是现在我想使用此IDE编写应用程序

首先,我向您展示我的代码:

 private static int getAktuelleArtikelID() throws NumberFormatException, SQLException
    {
        ResultSet ergebnisSet = null;
        int ergebnis;
        try
        {
            Connection verbindung = DriverManager.getConnection("jdbc:mysql://localhost:3306/foo", "bar", "foobar!");
            Statement statement = verbindung.createStatement();
            String abfrage = "SELECT artikel_id FROM Artikel order by 1 desc limit 1";
            ergebnisSet = statement.executeQuery(abfrage);
            ergebnisSet.next();

        }
        catch (Exception exc)
        {
            exc.printStackTrace();
        }

        ergebnis = Integer.parseInt(ergebnisSet.getString(1));
        return ergebnis;

    }

该代码在我的观点看来似乎是正确的,我更喜欢jdbc的问题。

我在这里添加了mysqlconnector 5.1.44,如下所示: 答案2来自 How to Mysql JDBC Driver to android studio

但是我得到这个错误:

W/System.err: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
W/System.err:     at java.lang.reflect.Constructor.newInstance0(Native Method)
W/System.err:     at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
W/System.err:     at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
W/System.err:     at com.mysql.jdbc.Util.getInstance(Util.java:408)
W/System.err:     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
W/System.err:     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
W/System.err:     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
W/System.err:     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
W/System.err:     at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2268)
W/System.err:     at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2017)
W/System.err:     at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
W/System.err:     at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
W/System.err:     at java.lang.reflect.Constructor.newInstance0(Native Method)
W/System.err:     at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
W/System.err:     at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
W/System.err:     at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)
W/System.err:     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
W/System.err:     at java.sql.DriverManager.getConnection(DriverManager.java:569)
        at java.sql.DriverManager.getConnection(DriverManager.java:219)
W/System.err:     at com.example.androidcameraapi2.Database.getAktuelleArtikelID(Database.java:20)
W/System.err:     at com.example.androidcameraapi2.Database.artikelHochladen(Database.java:40)
W/System.err:     at com.example.androidcameraapi2.MainActivity$7.onClick(MainActivity.java:227)
W/System.err:     at android.view.View.performClick(View.java:6597)
W/System.err:     at android.view.View.performClickInternal(View.java:6574)
W/System.err:     at android.view.View.access$3100(View.java:778)
W/System.err:     at android.view.View$PerformClick.run(View.java:25885)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:873)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err:     at android.os.Looper.loop(Looper.java:193)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6669)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
W/System.err: Caused by: android.os.NetworkOnMainThreadException
W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
        at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:117)
W/System.err:     at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
        at java.net.InetAddress.getAllByName(InetAddress.java:1154)
W/System.err:     at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:188)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300)
W/System.err:     at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2189)
W/System.err:     at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2222)
W/System.err:   ... 24 more
D/AndroidRuntime: Shutting down VM

也让Graddle想要更新,但是我已经尝试过了,这似乎使一切变得更糟

1 个答案:

答案 0 :(得分:1)

以下是一些建议:

  1. 永远不要将ResultSet传递到方法范围之外。您在一个方法中创建它并用该方法清理它。将数据加载到对象中并将其返回给调用方。
  2. 永远不要以这种方式在数据访问类中创建一个Connection。您应该使用池化连接。
  3. 实际应用程序记录异常。
  4. 坚持使用非特定于数据库的SQL(例如MySQL)。您可以通过这种方式保持代码的可移植性。
  5. 如果值应该是唯一的,则将该要求构建到您的架构中,而不是将其获取的架构中。
  6. 连接参数(例如URL,用户名,密码)应在配置中从您的应用中外部化。
  7. 您永远不应在应用程序中使用数据库管理员证书。
  8. 纯文本凭据是闯入数据库的邀请。

这是我编写您的方法的方式:

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * JDBC demo.
 * User: mduffy
 * Date: 5/8/19
 * Time: 2:37 PM
 * @link https://stackoverflow.com/questions/56046854/added-mysql-connector-but-connection-is-still-dying?noredirect=1#comment98735575_56046854
 */
public class JdbcDemo {

    private static final String SELECT_SQL = "SELECT artikel_id FROM Artikel ";

    private DataSource dataSource;

    public JdbcDemo(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public List<String> getAktuelleArtikelID() {
        List<String> aktuelleArtikelId = new ArrayList<>();
        ResultSet rs = null;
        Statement st = null;
        try {
            st = this.dataSource.getConnection().createStatement();
            rs = st.executeQuery(SELECT_SQL);
            while (rs.next()) {
                aktuelleArtikelId.add(rs.getString(1));
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(rs);
            close(st);
        }
        return aktuelleArtikelId;
    }

    // Should be in a utility class
    private static void close(ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static void close(Statement st) {
        try {
            if (st != null) {
                st.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}