【问题标题】:JDBC/MYSQL Communications link failure (ECLIPSE/ANDROID)JDBC/MYSQL 通信链路故障 (ECLIPSE/ANDROID)
【发布时间】:2014-12-30 13:11:38
【问题描述】:

我一直在尝试制作一个简单的 hello world 应用程序,它使用 jdbc 来查询 mysql 并检索/println 结果。

我正在使用从教程点到 android 代码的本教程:

http://www.tutorialspoint.com/jdbc/jdbc-sample-code.htm

这是我采用的版本:

    package com.example.myfirstapp0006;

    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import java.sql.*;

    public class MainActivity extends ActionBarActivity {

        // JDBC driver name and database URL
        static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        static final String DB_URL = "jdbc:mysql://localhost/EMP";

        // Database credentials
        static final String USER = "username";
        static final String PASS = "password";

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

            Connection conn = null;
            Statement stmt = null;
            try{
                // STEP 2: Register JDBC driver
                Class.forName("com.mysql.jdbc.Driver");

                // STEP 3: Open a connection
                System.out.println("Connecting to database...");
                conn = DriverManager.getConnection(DB_URL,USER,PASS);

                // STEP 4: Execute a query
                System.out.println("Creating statement...");
                stmt = conn.createStatement();
                String sql;
                sql = "SELECT id, first, last, age FROM Employees";
                ResultSet rs = stmt.executeQuery(sql);

                // STEP 5: Extract data from result set
                while(rs.next()) {
                    // Retrieve by column name
                    int id = rs.getInt("id");
                    int age = rs.getInt("age");
                    String first = rs.getString("first");
                    String last = rs.getString("last");

                    // Display values
                    System.out.println("ID: " + id);
                    System.out.println(", Age: " + age);
                    System.out.println(", First: " + first);
                    System.out.println(", Last: " + last);
                }

                // STEP 6: Clean-up environment
                rs.close();
                stmt.close();
                conn.close();
            }catch(SQLException se){
                //Handle errors for JDBC
                se.printStackTrace();
            }catch(Exception e){
                //Handle errors for Class.forName
                e.printStackTrace();
            }finally{
                //finally block used to close resources
                try{
                    if(stmt != null)
                        stmt.close();
                }catch(SQLException se){
                    se.printStackTrace();
                }//end finally try
            }//end try
            System.out.println("Goodbye!");
        }//end onCreate

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}//end MainActivity

我收到这些错误:

11-03 18:55:14.854: W/System.err(389)   com.mysql.jdbc.CommunicationsException: Communications link failure
11-03 18:55:14.854: W/System.err(389):  The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 
11-03 18:55:14.854: W/System.err(389):  at  com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1032)
11-03 18:55:14.864: W/System.err(389):  at  com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:338) 
11-03 18:55:14.864: W/System.err(389):  at  com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2232)
11-03 18:55:14.864: W/System.err(389):  at  com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2265)
11-03 18:55:14.864: W/System.err(389):  at  com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2064)
11-03 18:55:14.864: W/System.err(389):  at  com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:790) 
11-0 18:55:14.864:  W/System.err(389):  at  com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:392)
11-03 18:55:14.874: W/System.err(389):  at  com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325)
11-03 18:55:14.874: W/System.err(389):  at  java.sql.DriverManager.getConnection(DriverManager.java:191) 
11-0 18:55:14.874:  W/System.err(389):  at  java.sql.DriverManager.getConnection(DriverManager.java:226) 
11-0 18:55:14.874:  W/System.err(389):  at  com.example.myfirstapp0006.MainActivity.onCreate(MainActivity.java:32)
11-03 18:55:14.874: W/System.err(389):  at  android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-03 18:55:14.883: W/System.err(389):  at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-03 18:55:14.883: W/System.err(389):  at  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-03 18:55:14.883: W/System.err(389):  at  android.app.ActivityThread.access$2300(ActivityThread.java:125) 
11-0 18:55:14.883:  W/System.err(389):  at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-03 18:55:14.883: W/System.err(389):  at  android.os.Handler.dispatchMessage(Handler.java:99) 
11-03 18:55:14.894: W/System.err(389):  at  android.os.Looper.loop(Looper.java:123) 
11-03 18:55:14.894: W/System.err(389):  at  android.app.ActivityThread.main(ActivityThread.java:4627) 
11-0 18:55:14.894:  W/System.err(389):  at  java.lang.reflect.Method.invokeNative(Native Method) 
11-0 18:55:14.894:  W/System.err(389):  at  java.lang.reflect.Method.invoke(Method.java:521) 
11-03 18:55:14.894: W/System.err(389):  at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-03 18:55:14.894: W/System.err(389):  at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
11-0 18:55:14.894:  W/System.err(389):  at  dalvik.system.NativeStart.main(Native Method) 
11-03 18:55:14.894: W/System.err(389):  Caused by: java.net.SocketException: Permission denied 
11-03 18:55:14.904: W/System.err(389):  at  org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocketImpl(Native Method) 
11-03 18:55:14.904: W/System.err(389):  at  org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocket(OSNetworkSystem.java:186)
11-03 18:55:14.904: W/System.err(389):  at  org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:265)
11-03 18:55:14.904: W/System.err(389):  at  java.net.Socket.startupSocket(Socket.java:774) 
11-03 18:55:14.904: W/System.err(389):  at java.net.Socket.<init>(Socket.java:316) 
11-0 18:55:14.904:  W/System.err(389):  at  com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:243)
11-03 18:55:14.913: W/System.err(389):  at  com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:297) 
11-03 18:55:14.913: W/System.err(389):  ... 22 more

有什么线索吗?

【问题讨论】:

  • 确保 MySQL 正在运行并侦听端口 3306。

标签: java android mysql eclipse jdbc


【解决方案1】:

你在哪里安装mysql? 尝试更改url中的主机;现在您正在尝试连接到 localhost: static final String DB_URL = "jdbc:mysql://localhost/EMP";

你不能在android手机上运行mysql,如果你想在本地执行它可以选择其他db(例如你可以使用SQLite)。

【讨论】:

  • 但是如果我选择使用SQLite,数据不会保存在手机上吗?
  • SQLite 将在您的手机上运行;所以你的数据会在手机上。如果你想在外部数据库上查询数据,你必须有一些 web 服务才能让你的数据对 android 客户端可用。
  • 那么如何使用外部数据库(在服务器上)存储数据并从手机查询?
  • 为什么要外部数据库?您是否有大量数据要保存在您的数据库中?
【解决方案2】:

Android 默认内置 SqlLite 数据库。您是否将 mysql 数据库作为附加包安装。你的mysql数据库在哪里?

参考这个link

【讨论】:

    【解决方案3】:

    这通常发生在 MySQL 达到其最大并发连接数时。尝试重新启动 MySQL。

    如果你需要更多的并发连接,你可以通过在[mysqld]下面添加这一行来更新my.cnf:

    max_connections=x
    

    其中 x 是最大并发连接数。

    可以通过运行查看活动连接数:

    SHOW STATUS WHERE `variable_name` = 'Threads_connected'
    

    MySQL 网站上还有更多信息:

    http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多