MySQL соединение на Vista с использованием Java JDBC, CommunicationException, попробовал общие ответы - PullRequest
0 голосов
/ 06 марта 2012

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

Я видел следующее исключение: 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 = sun.misc.Launcher$AppClassLoader@1054f93 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 Ответ

1 голос
/ 07 марта 2012

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

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

Это приводит к тому, что URL передается в код getConnection, который выглядит как "jdbc: mysql: // localhost: 3306 / dbaccess03tstrootpassword" MySQL выглядитдля базы данных с именем dbaccess03tstrootpassword, которая не существует и приводит к неудачному соединению со значением null.

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

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