2012-03-05 3 views
0

У меня проблемы с новичком, связанные с подключением mysql с использованием java на 64-битной платформе Vista. Я читал веб-информацию от других с аналогичной проблемой, до сих пор не повезло. Вероятно, это связано с отсутствием понимания с моей стороны. Я вижу, что порт 3306 прослушивает с помощью netstat -an. Я отключил брандмауэр MS и установил webroot, так как мой брандмауэр и mysql разрешены. Я добавил путь к jar-файлу драйвера JDBC в опции -cp. Отладка, похоже, указывает на то, что драйвер не зарегистрирован, но я могу выполнять все функции mysql в базе данных из командной строки.mysql connection on vista using java jdbc, communicationException, пробовал общие ответы

Я видел следующее исключение: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Коммуникации отказа канала

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 

Это мой выход:

C:\Users\Jerry>java -cp c:\Users\jerry;c:\ProgramFiles(86)\ConnectorJ\mysql-connector-java-5.1.11-bin dbaccess 
FOO: jdbc:mysql://127.0.0.1:3306/access03tstroot 
Cannot connect to database server 
SQLEXCEPTION: com.mysql.jdbc.Driver 
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 
at java.net.URLClassLoader$1.run(Unknown Source) 
at java.net.URLClassLoader$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at dbaccess.mysqlConnection(dbaccess.java:77) 
at dbaccess.main(dbaccess.java:59) 

Я распечатать сообщения с тем, что я отправляю, и установить точки останова для остановки в DriverManager.getConnection. Думаю, есть фрагмент кода, который проверяет зарегистрированный драйвер.

Код не работает во время isDriverAllowed (aDriver.driver, callCL) Я понимаю, что вызов Class.forName зарегистрирует новый драйвер при его обнаружении. Цикл делает два прохода, сначала ищет драйвер ODBC, затем com.mysql.jdbc.driver.

callerCL = [email protected] URL-адрес является JDBC: MySQL:/loacalhost: 3306 access03tst

for(DriverInfo aDriver : registeredDrivers) { 
     // If the caller does not have permission to load the driver then 
     // skip it. 
     if(isDriverAllowed(aDriver.driver, callerCL)) { 
      try { 
       println(" trying " + aDriver.driver.getClass().getName()); 
       Connection con = aDriver.driver.connect(url, info); 
       if (con != null) { 
        // Success! 
        println("getConnection returning " + aDriver.driver.getClass().getName()); 
        return (con); 
       } 
      } catch (SQLException ex) { 
       if (reason == null) { 
        reason = ex; 
       } 
      } 

     } else { 
      println(" skipping: " + aDriver.getClass().getName()); 
     } 

    } 

Моя команда/компиляция:

javac -d . -sourcepath . -cp c:\Users\Jerry;c:\ProgramFiles(86)\ConnectorJ\mysql-connector-java-5.1.11-bin c:\Users\Jerry\dbaccess.java 

Мои выполнить команду:

java -cp c:\Users\jerry;c:\ProgramFiles(86)\ConnectorJ\mysql-connector-java-5.1.11-bin dbaccess 

Мой код следующим образом:

package dbaccess; 

import java.sql.*; 
import java.lang.*; 

public class dbaccess 
{ 
    // Public static indicates that this is a class variable not an instance 
    // variable. It is part of the class as a whole. 
    public static Connection conn = null; 
    public boolean success; 

    public static void main (String[] args) 
    { 
     init(); 
     mysqlConnection(); 
     getList catList = new getList(); 
     boolean status = catList.success; 
    } 
    public static void mysqlConnection() 
    { 
     try 
     { 
      String dbName = "access03tst"; 
      String userName = ""; 
      String password = ""; 
      String url = "jdbc:mysql://localhost:3306/"; 
      String driver = "com.mysql.jdbc.driver"; 
      String foo = url+dbName+userName+password; 
      System.out.println("FOO: " + foo); 

      //Register the JDBC driver for MySQL. 
      Class.forName("com.mysql.jdbc.Driver"); //.newInstance(); 

      System.out.println("Surprise we got here "); 
      conn = DriverManager.getConnection(url+dbName+userName+password); 
      System.out.println ("Database connection established"); 
      System.out.println("URL: " + url); 
      System.out.println("Connection: " + conn); 
     } 
     catch (Exception e) 
     { 
      System.err.println ("Cannot connect to database server"); 
     } 
     finally 
     { 
      if (conn != null) 
      { 
       try 
       { 
       conn.close(); 
       System.out.println ("Database connection terminated"); 
       } 
       catch (Exception e) { /* ignore close errors */ } 
      } 
     } // end finally 
    } 

    public static void init() 
    { 
    // 
    // Public static indicates that this is a class variable not an instance 
    // variable. It is part of the class as a whole. 
    conn = null; 
    boolean success = false; 
    boolean CatRequest = false; 
    } 

} 

ответ

1

Наконец-то я нашел ответ. Я использовал синтаксис для URL, найденный во многих ссылках.

 String userName = "root"; 
     String password = "password"; 
     String url = "jdbc:mysql://localhost:3306/"; 
     conn = DriverManager.getConnection(url+dbName+userName+password); 

Это приводит к URL передается в код GetConnection, который появляется как «JDBC: MySQL: // локальный: 3306/dbaccess03tstrootpassword» MySQL ищет базы данных с именем dbaccess03tstrootpassword, который не существует и результатов в failed Connection of null.

Я изменил код на следующий синтаксис и получил действующее соединение.

String urlFormated = "jdbc:mysql://localhost:3306/" 
       + dbName 
       + "?user=" 
       + userName 
       + "&password=" 
       + password; 
conn = DriverManager.getConnection(urlFormated);