2014-04-25 25 views
5

Đây là sản phẩm của chương trình đưa ra dưới đây:JDBC: Kết nối trả về NULL, phải làm gì?

Connection made! 
Schema Name:null 

Successfully connected to null 
Releasing all open resources ... 

Bên establishConnection(), conn được khởi tạo như null. Sau đó, câu lệnh đầu tiên bên trong khối try được thiết lập kết nối với cơ sở dữ liệu, và câu lệnh thứ ba sau đó in tên lược đồ hiện tại của conn.

Theo API, getSchema() trả về tên lược đồ hiện tại hoặc null nếu không có.

Điều này có nghĩa là không có lược đồ (tôi nghĩ tên lược đồ giống với tên cơ sở dữ liệu) được liên kết với conn? Bất cứ ai có thể đề nghị nếu tôi là chính xác trong dự đoán của tôi, và cũng đề nghị tại sao là không có lược đồ hoặc null liên kết với conn?

public class ConnectDB { 

    private Connection establishConnection() throws SQLException { 
     Connection conn = null; 
     try { 
      conn = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/test_final1", "root", "password"); 
      System.out.println("Connection made!"); 
      System.out.println("Schema Name:"+conn.getSchema()+"\n"); 
     } catch (SQLException sqle) { 
      System.err.println("SQL Exception thrown while making connection"); 
      printSQLException(sqle); 
     } 
     return conn; 
    } 

    public static void main(String[] args) { 
     ConnectDB cdb= new ConnectDB(); 
     Connection myconn=null; 
     try{ 
      myconn=cdb.establishConnection(); 
      if(myconn!=null) System.out.println("Successfully connected to " + myconn.getSchema()); 
     }catch (SQLException e) { 
       ConnectDB.printSQLException(e); 
     } catch (Exception e) { 
      e.printStackTrace(System.err); 
     } finally { 
      ConnectDB.closeConnection(myconn); 
     } 

    } 
+2

CÂU HỎI NÀY LÀ KHÔNG PHẢI LÀ MỘT trùng lặp. Câu hỏi khác là về Android, rất nhiều về trình điều khiển JTD (tôi chưa từng sử dụng). Tôi đang đăng bình luận này để làm rõ, vì tôi đã có một bình luận nói rằng nó là một bản sao, đã bị xóa sau lời giải thích của tôi. – Solace

+0

Mã ở đâu bạn đã tải Trình điều khiển 'MYSQL' –

+1

Mọi người! Vấn đề không phải là về việc nhận được một kết nối 'null' nhưng về một giá trị trả về' null' từ việc thực thi phương thức 'Connection # getSchema'. –

Trả lời

6

MySQL không hỗ trợ các khái niệm về schema. Đối với MySQL, lược đồ trên thực tế là cơ sở dữ liệu. Từ MySQL Glossary:

schema

Về mặt lý thuyết, một schema là một tập các đối tượng cơ sở dữ liệu liên quan đến nhau, chẳng hạn như các bảng, cột bảng, kiểu dữ liệu của các cột, các chỉ số, khóa ngoài, và vân vân. (...)

Dựa trên this answer from MySQL forums, bạn không thể có được cơ sở dữ liệu hiện tại (hoặc cơ sở dữ liệu) thông qua phương pháp Connection#getSchema (mà đã được bổ sung từ phiên bản Java 7 với JDBC 4) nhưng sử dụng Connection#getCatalogtrừ khi bạn sử dụng mới nhất JDBC jar lái xe:

các trình điều khiển JDBC (vì di sản, mysql không gọi họ là "schemas" cho đến 5.0, và JDBC không có cách nào để chọn schemas cho đến khi JDBC4), gọi cơ sở dữ liệu "catalog ", do đó, bạn phải gọi getCatalogs() để lấy danh sách cơ sở dữ liệu

Tôi đã thực hiện nhanh chóng bẩn để chứng minh câu nghiêng ở trên (trừ khi bạn sử dụng trình điều khiển jar JDBC mới nhất). Sử dụng getCatalog() làm việc sử dụng Java 6:

public class DirtyQuickTest { 
    private static final String url = "jdbc:mysql://localhost:7841/test"; 
    private static final String user = "lmendozaj"; 
    private static final String password = "s3cr3t"; //I won't show you my password 
    public static void main(String[] args) throws Exception { 
     Connection con = null; 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      con = DriverManager.getConnection(url, user, password); 
      //commented since doesn't exists in Java 6 
      //System.out.println(con.getSchema()); 
      System.out.println(con.getCatalog()); 
     } finally { 
      con.close(); 
     } 
    } 
} 

Output:

test 

Sau đó, tôi thực hiện cùng mã trong Java 8 và uncomment báo cáo kết quả chứa getSchema sử dụng mysql-connector-java-5.1.31-bin .jar (hiện là Trình điều khiển Trình kết nối Java mới nhất cho MySQL).Đây là kết quả đầu ra:

null 
test 

Điều đó có nghĩa là họ vẫn không hỗ trợ phương thức getSchema.

liên quan:

-1

tạo một lớp riêng biệt và xác định phương thức getConnection tĩnh. Tôi nghĩ rằng nó có thể giúp u

public class ConnectionManager { 
private static String url = "jdbc:mysql://localhost:3306/myDB";  
private static String driverName = "com.mysql.jdbc.Driver"; 
private static String usernsme = "root"; 
private static String pasword = "root"; 
private static Connection con; 
private static String url; 

public static Connection getConnection() { 
    try { 
     Class.forName(driverName); 
     try { 
      con = DriverManager.getConnection(url, username, password); 
     } catch (SQLException ex) { 

      System.out.println("Failed to create the database connection."); 
     } 
    } catch (ClassNotFoundException ex) { 

     System.out.println("Driver not found."); 
    } 
    return con; 
} 
} 

Sau đó, nhận được kết nối trong một mã số như sau:

private Connection con = null; 
private Statement stmt = null; 
private ResultSet rs = null; 
con = ConnectionManager.getConnection(); 
stmt = con.createStatement(); 
rs = stmt.executeQuery(sql); 
+0

Tôi đã thử nó, đã không giúp đỡ. Thứ hai, bạn có thể vui lòng làm rõ những gì bạn có nghĩa là "xác định lớp tĩnh"? – Solace

+0

Bạn cần tạo lớp seprate cho kết nối JDBC của mình. Trong trường hợp của tôi, tôi tạo lớp ConnectionManager. và định nghĩa phương thức tĩnh trên lớp này. giống như tôi làm trong câu trả lời này. – Vishal16

+0

Tôi đã thử điều đó. Nó không giúp được gì. Nhưng chỉ để làm cho nó rõ ràng với tôi, xin vui lòng làm rõ tại sao bạn đề nghị nó? Giải pháp của bạn sẽ giúp ích như thế nào? – Solace