【问题标题】:Added mysql-connector, but connection is still dying添加了 mysql-connector,但连接仍然死机
【发布时间】:2019-05-08 18:18:34
【问题描述】:

我尝试在 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 也想要更新,但我已经尝试过了,它似乎让一切变得更糟

【问题讨论】:

  • “我认为该代码似乎正确” - 显然这是不正确的。您观察到的行为是不可取的。问题在于您的代码,而不是 JDBC。
  • 请教我
  • @duffymo 似乎 Hein 是 StackOverflow 的新手,并且可能没有意识到在提出问题时,有用的细节是诊断的证据,而不是对似乎不是问题的保证。此外,Hein,这里的目标是帮助您自学并确保您的学习被记录在对您的问题的高质量答案中,这些答案可能会被未来的访问者发现。有关什么是好问题的更多提示,请参阅stackoverflow.com/help/how-to-ask
  • @ctt 谢谢你,我真的不知道更多细节,我唯一可以补充的是,我使用 github,我的伙伴也有同样的错误。
  • @HeinAndré "MySQLNonTransientConnectionException: 无法创建与数据库服务器的连接" 您是否仔细检查了您的用户名/密码?数据库真的在运行吗?你能用另一个工具连接它吗?端口对吗?

标签: java android mysql


【解决方案1】:

以下是一些建议:

  1. 永远不要将 ResultSet 传递到方法范围之外。您在一个方法中创建它并在该方法中清理它。将数据加载到对象中并将其返回给调用者。
  2. 永远不要以这种方式在数据访问类中创建连接。您应该使用池连接。
  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();
        }
    }
}

【讨论】:

  • 非常感谢,它看起来很干净,安全,并且易于实现,但是错误仍然存​​在,所以就像我的猜测,它不在代码中,这是我构建我的项目/库等。有人可以给我建议吗?
  • 不,不可能是同一个错误。我的代码中的 ResultSet 永远不能为空。您是否更改了调用此新方法的代码部分?您是否重建并重新打包了您的应用程序?
  • 很抱歉造成混乱,不会出现导致运行崩溃的错误,但我仍然遇到 MySQLNonTransientConnectionException 的问题
  • 请说清楚一点。将您的错误消息弹出到 Google 中可以将其恢复。检查驱动 JAR 的版本:stackoverflow.com/questions/50177907/…
  • 再来一次:这是你的密码。 JDBC 有效 - 您的代码无效。
猜你喜欢
  • 2019-09-05
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2012-04-29
  • 2012-10-14
  • 2021-10-17
相关资源
最近更新 更多