JDBC/MYSQL通信链接失败(ECLIPSE/ANDROID)

问题描述:

我一直在试图制作一个简单的Hello World应用程序,它使用jdbc来查询mysql并检索/ println结果。JDBC/MYSQL通信链接失败(ECLIPSE/ANDROID)

进出口使用从教程本教程点采用的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 

有关于此的任何线索?

+0

确保MySQL正在运行并侦听端口3306. – 2014-11-03 19:40:02

当MySQL达到最大并发连接数时,通常会发生这种情况。尝试重新启动MySQL。其中x是并发连接的最大数目

max_connections=x 

如果你需要更多的并发连接,您可以通过以下的[mysqld]加入这一行更新的my.cnf。

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

SHOW STATUS WHERE `variable_name` = 'Threads_connected' 

有MySQL的网站上的更多信息,以及:

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

的Android默认情况下具有内置SqlLite数据库。你有没有安装mysql数据库作为额外的软件包。你的mysql数据库位于哪里?

请参阅本link

你在哪里安装mysql? 尝试更改网址中的主机;现在你正在尝试连接到本地主机: static final String DB_URL =“jdbc:mysql:// localhost/EMP”;

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

+0

但是,如果我选择使用SQLite,数据将不会保存在手机上吗? – Jacs 2014-11-03 20:20:12

+0

SQLite将在您的手机上运行;所以你的数据将在手机上。如果你想查询外部数据库的数据,你必须有一些Web服务来将你的数据提供给Android客户端。 – ricgra 2014-11-03 20:24:00

+0

那么如何使用外部数据库(在服务器上)来存储数据并从手机中查询它? – Jacs 2014-11-03 20:29:06