2014-04-25 10 views
5

इस कार्यक्रम के उत्पादन में नीचे दिए गए है:जेडीबीसी: कनेक्शन वापस लौटने, क्या करना है?

Connection made! 
Schema Name:null 

Successfully connected to null 
Releasing all open resources ... 

अंदर establishConnection(), कोन अशक्त के रूप में आरंभ नहीं हो जाता। फिर कोशिश ब्लॉक के अंदर पहला कथन डेटाबेस के साथ कनेक्शन स्थापित करना है, और तीसरा कथन तब कॉन की वर्तमान स्कीमा का नाम प्रिंट कर रहा है।

API के अनुसार, getSchema() वर्तमान स्कीमा नाम या शून्य देता है यदि कोई नहीं है।

इसका मतलब है कि कोई स्कीमा नहीं है (मुझे लगता है कि स्कीमा नाम डेटाबेस नाम के समान है) 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

यह प्रश्न एक डुप्लिकेट नहीं है। दूसरा सवाल एंड्रॉइड के बारे में है, जेटीडीएस ड्राइवर के बारे में बहुत कुछ है (मैंने इसका उपयोग नहीं किया है)। मैं स्पष्टीकरण के लिए इस टिप्पणी को पोस्ट कर रहा हूं, क्योंकि मुझे एक टिप्पणी मिली थी कि यह एक डुप्लिकेट है, जो मेरी व्याख्या के बाद हटा दिया गया था। – Solace

+0

वह कोड कहां है जहां आपने 'MYSQL ड्राइवर' –

+1

लोगों को लोड किया है! समस्या 'शून्य' कनेक्शन प्राप्त करने के बारे में नहीं है, लेकिन 'कनेक्शन # getSchema' विधि निष्पादित करने से' शून्य 'वापसी मान के बारे में है। –

उत्तर

6

MySQL स्कीमा की अवधारणा का समर्थन नहीं करता। MySQL के लिए, स्कीमा वास्तव में डेटाबेस है। MySQL Glossary से:

स्कीमा

वैचारिक रूप से, एक स्कीमा जैसे तालिकाओं, तालिका स्तंभ, स्तंभों की डेटा प्रकार, अनुक्रमित, विदेशी कुंजी, और इतने पर के रूप में परस्पर डेटाबेस ऑब्जेक्ट्स, का एक सेट है। (...)

this answer from MySQL forums के आधार पर, आप मौजूदा डेटाबेस (या डेटाबेस) Connection#getSchema विधि (जो JDBC 4 के साथ जावा 7 के बाद से जोड़ा गया था), लेकिन Connection#getCatalogका उपयोग कर के माध्यम से नहीं मिल सकता है जब तक कि आप नवीनतम का उपयोग JDBC जार ड्राइवर:

JDBC ड्राइवर (विरासत की वजह से, mysql 5.0 जब तक उन्हें "स्कीमा" फोन नहीं किया, और JDBC JDBC4 तक स्कीमा का चयन करने के लिए एक रास्ता नहीं था), कॉल डेटाबेस "कैटलॉग ", इसलिए आपको डेटाबेस की सूची प्राप्त करने के लिए getCatalogs() को कॉल करना होगा

मैं ऊपर इटैलिक वाक्य साबित करने के लिए एक गंदा त्वरित (जब तक आप नवीनतम JDBC जार ड्राइवर का उपयोग करें) बनाया है। getCatalog() का उपयोग जावा 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(); 
     } 
    } 
} 

आउटपुट:

test 

तब मैं जावा 8 में एक ही कोड निष्पादित और बयान mysql-कनेक्टर-जावा-5.1.31-बिन का उपयोग कर getSchema युक्त uncommented .jar (वर्तमान में MySQL के लिए नवीनतम जावा कनेक्टर ड्राइवर)।

null 
test 

वे अभी भी getSchema विधि का समर्थन नहीं करते इसका मतलब है: यह उत्पादन किया गया था।

संबंधित:

-1

एक seprate वर्ग बना सकते हैं और getConnection विधि स्थिर परिभाषित करते हैं। मुझे लगता है कि यह मदद मिल सकती है इस प्रकार यू

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; 
} 
} 

फिर एक कोड में कनेक्शन लेने:

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

मैंने कोशिश की, मदद नहीं की। दूसरा, क्या आप कृपया स्पष्ट कर सकते हैं कि "कक्षा स्थिर परिभाषित करना" का क्या अर्थ है? – Solace

+0

आपको अपने जेडीबीसी कनेक्शन के लिए सीप्रेट क्लास बनाना होगा। मेरे मामले में मैं कनेक्शन प्रबंधक वर्ग बनाते हैं। और विधि को इस वर्ग पर स्थिर के रूप में परिभाषित करें। जैसा कि मैं इस जवाब में करता हूं। – Vishal16

+0

मैंने पहले ही कोशिश की है। यह मदद नहीं की। लेकिन सिर्फ मुझे यह स्पष्ट करने के लिए, कृपया स्पष्ट करें कि आप इसका सुझाव क्यों देते हैं? आपका समाधान कैसे मदद करेगा? – Solace

संबंधित मुद्दे