डेटाबेस से कनेक्ट करते समय Class.forName ("oracle.jdbc.driver.OracleDriver") का वास्तविक उपयोग क्या है?


91

आज्ञा क्या होगी

Class.forName("oracle.jdbc.driver.OracleDriver")

ओरेकल डेटाबेस से कनेक्ट करते समय वास्तव में क्या करते हैं? क्या एक ही काम करने का एक वैकल्पिक तरीका है?


6
संबंधित: stackoverflow.com/questions/5992126/loading-jdbc-driver ध्यान दें कि आपको अपने एप्लिकेशन के स्टार्टअप के दौरान इसे केवल एक बार कॉल करने की आवश्यकता है ; आपको एप्लिकेशन के जीवनकाल के दौरान कनेक्शन प्राप्त करने से पहले इसे हर बार कॉल करने की आवश्यकता नहीं है।
BalusC

@BalusC मान लीजिए कि मेरे पास अलग क्लास में मेरा कनेक्शन विस्तार से है Aजहां मैं Class.forName("oracle.jdbc.driver.OracleDriver")क्लास Aकंस्ट्रक्टर में कॉल करता हूं , और मैं A'sप्रत्येक सर्वलेट के लिए कनेक्शन फ़ील्ड प्राप्त करने के लिए ऑब्जेक्ट बनाता हूं जहां मुझे कनेक्शन की आवश्यकता है फिर जावा को छोड़ Class.forName("oracle.jdbc.driver.OracleDriver")देगा या फिर से लोड करेगा?
आसिफ मुश्ताक

जवाबों:


68

यह FQCN (पूरी तरह से योग्य वर्ग नाम) के साथ वर्ग ऑब्जेक्ट का संदर्भ प्राप्त करता है oracle.jdbc.driver.OracleDriver

यह डेटाबेस से कनेक्ट करने के संदर्भ में कुछ भी "नहीं" करता है, यह सुनिश्चित करने से अलग कि निर्दिष्ट क्लास लोडर द्वारा लोड किया गया है । लेखन में कोई बुनियादी अंतर नहीं है

Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
// and
Class<?> stringClass = Class.forName("java.lang.String");

Class.forName("com.example.some.jdbc.driver")कॉल में दिखाने विरासत JDBC का उपयोग करता है क्योंकि कोड है कि विरासत एक JDBC ड्राइवर लोड करने के रास्ते

से जावा ट्यूटोरियल :

JDBC के पिछले संस्करणों में, एक कनेक्शन प्राप्त करने के लिए, आपको सबसे पहले विधि को कॉल करके अपने JDBC ड्राइवर को इनिशियलाइज़ करना होगा Class.forName। इस तरीके के लिए एक प्रकार की वस्तु की आवश्यकता होती है java.sql.Driver। प्रत्येक JDBC ड्राइवर में एक या अधिक वर्ग होते हैं जो इंटरफ़ेस को लागू करता है java.sql.Driver
...
कोई भी JDBC 4.0 ड्राइवर जो आपके क्लास पथ में पाए जाते हैं, स्वचालित रूप से लोड होते हैं। (हालांकि, आपको JDBC 4.0 से पहले किसी भी ड्राइवर को विधि से लोड करना होगा Class.forName।)

आगे पढ़ना (पढ़ना: सवाल यह एक डुबकी है)


29
दूसरे शब्दों में, यह आपको अपनी कक्षा के लिए स्पष्ट आयात किए बिना चालक वर्ग का उपयोग करने की अनुमति देता है। यह आपको अपने वर्गपथ में ओरेकल चालक के बिना परियोजना का निर्माण करने की अनुमति देता है।
जस्टिनकेएसयू

3
ध्यान दें कि "विरासत के रास्ते" में आप Class.forName()बिना ड्राइवर के संदर्भ को कैप्चर किए बिना कॉल करेंगे। लौटा, इसलिए यह पहली नज़र में नो-ऑप ऑपरेशन जैसा लगता है
मैट बी

11
ऐसा इसलिए है क्योंकि JDBC ड्राइवर में एक स्टेटिक इनिशियलाइज़र होना चाहिए जो DriverManager के साथ ड्राइवर को पंजीकृत करता है। Class.forName () का उपयोग करते समय यह इनिशलाइज़र निष्पादित होता है और ड्राइवर पंजीकृत होता है। JDBC 4.0 के बाद से DriverManager Classpath पर ड्राइवरों को खोजने के लिए ServiceLoader का उपयोग करता है।
मार्क रोटेवेल

1
@MattBall, पूर्व JDBC 4.0 के बारे में, ड्राइवर को एक संदर्भ प्राप्त करने या उस ड्राइवर वर्ग के एक स्थिर फ़ंक्शन को कॉल करने से पहले से ही ड्राइवर वर्ग को ऑटो-लोड करेगा। तो हमें मैन्युअल रूप से क्यों करना है Class.forName("etc.driver")?
पचेरियर

1
@ स्पेसर गलत धारणा। JDBC को नहीं पता है कि आप किस ड्राइवर को लोड करना चाहते हैं, इसलिए JDBC (जो ड्राइवर-अज्ञेयवादी है) में कुछ भी नहीं है जो ड्राइवर वर्ग को संदर्भित करना जानता है। तो आपको कुछ ऐसा चाहिए जो एक क्लास लोड को ट्रिगर करे। मुझे लगता है कि इसके बजाय एक स्थिर विधि काम करेगी Class.forName(...)
मैट बॉल

13

यह चालक को पंजीकृत करता है; फार्म का कुछ:

public class SomeDriver implements Driver {
  static {
    try {
      DriverManager.registerDriver(new SomeDriver());
    } catch (SQLException e) {
      // TODO Auto-generated catch block
    }
  }

  //etc: implemented methods
}

6

से जावा JDBC ट्यूटोरियल :

JDBC के पिछले संस्करणों में, एक कनेक्शन प्राप्त करने के लिए, आपको सबसे पहले विधि को कॉल करके अपने JDBC ड्राइवर को इनिशियलाइज़ करना होगा Class.forName। JDBC 4.0 ड्राइवर जो आपके क्लास पथ में पाए जाते हैं, वे स्वचालित रूप से लोड होते हैं। (हालांकि, आपको JDBC 4.0 से पहले किसी भी ड्राइवर को विधि से लोड करना होगा Class.forName।)

इसलिए, यदि आप जावा 1.6 के साथ Oracle 11g (11.1) ड्राइवर का उपयोग कर रहे हैं, तो आपको कॉल करने की आवश्यकता नहीं है Class.forName। अन्यथा, आपको ड्राइवर को इनिशियलाइज़ करने के लिए इसे कॉल करने की आवश्यकता है।


1
@Jonathanwhat का अर्थ है "JDBC 4.0 से पहले के किसी भी ड्राइवर को मैन्युअल रूप से लोड करने के लिए विधि Class.forName" के साथ क्या आप समझा सकते हैं?
अरविंद

Class.forNameकॉल बलों classloader किसी वर्ग लोड करने के लिए। यह ट्यूटोरियल में वर्णित मैनुअल लोडिंग स्टेप है।
जोनाथन

@ जोनाथन यही वजह है कि मेरा कनेक्शन अभी भी बिना काम चल रहा है class.forName();:)
आसिफ मुश्ताक

2

जावा 6 से पहले DriverManagerवर्ग को यह नहीं पता होता कि आप किस JDBC ड्राइवर का उपयोग करना चाहते हैं। Class.forName("...")ड्राइवर कक्षाओं को प्री-लोड करने का एक तरीका था।

यदि आप Java 6 का उपयोग कर रहे हैं तो आपको अब ऐसा करने की आवश्यकता नहीं है।


हां, एक का उपयोग करने की आवश्यकता है: OracleDataSource अब docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 और यह url को अपने आप बनाता है: अंतिम OracleDataSource ds = new OracleDataSource (); ds.setDriverType ( "पतली"); ds.setServerName (होस्टनाम); ds.setPortNumber (बंदरगाह); //ds.setDatabaseName(dbName); ds.setServiceName (DBNAME); कनेक्शन = ds.getConnection (उपयोगकर्ता, pwd);
राजेश गोयल

1

यह कमांड Oracle DriverDager उदाहरण के लिए उपलब्ध होने के लिए Oracle ड्राइवर के वर्ग को लोड करता है। क्लास लोड होने के बाद सिस्टम इसका उपयोग करके ओरेकल से कनेक्ट हो सकता है। एक विकल्प के रूप में आप DriverManager के रजिस्टरड्राइव विधि का उपयोग कर सकते हैं और इसे JDBC ड्राइवर की आवश्यकता के साथ पास कर सकते हैं।



0

Oracle.jdbc.OracleDriver का उपयोग करें, oracle.jdbc.driver.OracleDriver का नहीं। अगर आपको ड्राइवर टॉम फ़ाइल "WEB-INF \ lib" निर्देशिका में है, तो आपको इसे रजिस्टर करने की आवश्यकता नहीं है, यदि आप टॉमटैट का उपयोग कर रहे हैं। इसे test.jsp के रूप में सहेजें और इसे अपनी वेब निर्देशिका में डालें, और अपने वेब ऐप फ़ोल्डर को Tomcat प्रबंधक में फिर से डालें:

<%@ page import="java.sql.*" %>

<HTML>
<HEAD>
<TITLE>Simple JSP Oracle Test</TITLE>
</HEAD><BODY>
<%
Connection conn = null;
try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:XXXX:dbName", "user", "password");
    Statement stmt = conn.createStatement();
    out.println("Connection established!");
}
catch (Exception ex)
{
    out.println("Exception: " + ex.getMessage() + "");

}
finally
{
    if (conn != null) {
        try {
            conn.close();   
        }
        catch (Exception ignored) {
            // ignore
        }
    }
}

%>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.