2013-08-17 7 views
11

में ड्राइवर श्रेणी कैसे स्थित है जेडीबीसी के संस्करण 4 में बढ़िया जोड़ों में से एक आपको ड्राइवर को Class.forName पर कॉल करके स्पष्ट रूप से लोड करने की आवश्यकता नहीं है। जब आपका एप्लिकेशन पहली बार डेटाबेस से कनेक्ट करने का प्रयास करता है, तो DriverManager एप्लिकेशन CLASSPATH में स्वचालित रूप से ड्राइवर को लोड करता है।जेडीबीसी 4

मेरा सवाल यह है कि कैसे? क्लासपाथ में कई ड्राइवर हैं तो क्या होगा?

एक बात मैं अनुमान लगा सकता हूं कि कनेक्शन यूआरएल को पार्स करने पर ड्राइवर को जेडीबीसी या ओडीबीसी की आवश्यकता है या नहीं, लेकिन एक जेडीबीसी अनुपालन ड्राइवरों में से एक कैसे कह सकता है जिसे डेटाबेस के लिए चुना जाना है I उपयोग कर रहा हूँ (मान लें कि मैं MySQL का उपयोग कर रहा हूं और मुझे MySQL-Connector ड्राइवर की आवश्यकता है)। क्या JVM में ऐसे डेटाबेस ड्राइवरों का कोई स्थिर मैपिंग है?

+0

आपको ड्राइवर की आवश्यकता क्यों है? –

+2

आप डेटाबेस से और कैसे कनेक्ट करेंगे। परंपरागत रूप से हम कक्षा करते हैं। फोर्ननाम (ड्राइवर)। –

+0

@atamanroman मेरे पास आपको बताने के लिए कुछ भी नहीं है, अपने शब्दकोष को SO से बाहर रखें। –

उत्तर

10

JDBC4 ड्राइवर लोड हो रहा है के बारे में कुछ जानकारी से लिया: http://www.onjava.com/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html

जब विधि getConnection कहा जाता है, DriverManager होगा JDBC ड्राइवर प्रारंभ और उन पर लोड किया गया के बीच में से एक उपयुक्त ड्राइवर का पता लगाने का प्रयास वर्तमान अनुप्रयोग के रूप में समान वर्ग लोडर का स्पष्ट रूप से उपयोग किया गया।

ड्राइवर प्रबंधक विकल्प प्राप्त करें कनेक्शन और getDrivers जावा एसई सेवा प्रदाता तंत्र (एसपीएम) का समर्थन करने के लिए बढ़ाए गए हैं। एसपीएम के अनुसार, एक सेवा को इंटरफेस और सार कक्षाओं के एक प्रसिद्ध सेट के रूप में परिभाषित किया गया है, और एक सेवा प्रदाता एक सेवा के कार्यान्वयन है। यह भी निर्दिष्ट करता है कि सेवा प्रदाता कॉन्फ़िगरेशन फ़ाइलें मेटा-आईएनएफ/सेवाओं निर्देशिका में संग्रहीत हैं। जेडीबीसी 4.0 ड्राइवरों में फाइल मेटा-आईएनएफ/सेवाएं/java.sql.Driver शामिल होना चाहिए। इस फ़ाइल में java.sql.Driver के जेडीबीसी ड्राइवर के कार्यान्वयन का नाम शामिल है।

org.apache.derby.jdbc.EmbeddedDriver 

अब के लिए आ रहा: उदाहरण के लिए, JDBC ड्राइवर लोड करने के लिए एक अपाचे डर्बी डेटाबेस से कनेक्ट करने के लिए, META-INF/सेवाओं/java.sql.Driver फ़ाइल निम्न प्रवेश होते हैं आपका प्रश्न।

मेरा सवाल यह है कि कैसे? क्या होगा यदि क्लासपाथ में एकाधिक ड्राइवर हैं?

क्लास लोडर नियम के रूप में, पहले पाया गया कोई भी वर्ग लोड हो जाएगा और यदि यह पहले ही लोड हो चुका है तो क्लास लोडर द्वारा पुनः लोड नहीं किया जाएगा।

10

प्रत्येक जेडीबीसी 4 अनुपालन चालक के पास META-INF/services/java.sql.Driver नामक अपने जार में एक फ़ाइल है, उस फ़ाइल में यह java.sql.Driver के कार्यान्वयन की सूची देगा। जब आप किसी कनेक्शन का अनुरोध करते हैं, तो DriverManager क्लासपाथ में META-INF/services/java.sql.Driver की सभी (!) प्रतियों को खोजने के लिए ServiceLoader का उपयोग करेगा और फिर सूचीबद्ध सभी वर्गों को लोड करेगा। जब java.sql.Driver कक्षा लोड हो जाती है, तो उसे DriverManager के साथ स्वयं पंजीकृत करना होगा, इसलिए DriverManager सर्विस लोडर का उपयोग करके सभी कक्षाओं को लोड करता है, और प्रत्येक Driver कार्यान्वयन स्वयं पंजीकृत करता है।

जब आप DriverManager से कनेक्शन का अनुरोध करते हैं, तो DriverManager उन सभी पंजीकृत ड्राइवरों पर पुन: सक्रिय होगा जो उन्हें Connection के लिए पूछते हैं। यह ड्राइवर यह जांचने के लिए जेडीबीसी यूआरएल का उपयोग करेगा कि यह प्रोटोकॉल का समर्थन करता है (उदाहरण के लिए जेबर्ड/फायरबर्ड जेडीबीसी जांच करता है कि यूआरएल "jdbc:firebirdsql:" या "jdbc:firebird:" से शुरू होता है)। यदि ड्राइवर प्रोटोकॉल का समर्थन नहीं करता है, तो यह null लौटाएगा, अगर यह प्रोटोकॉल का समर्थन करता है तो यह या तो एक स्थापित कनेक्शन लौटाएगा, या यह SQLException फेंक देगा (उदाहरण के लिए यदि आपने यूआरएल में कोई त्रुटि की है, या यह नहीं हो सका जुडिये)। यदि सभी चालकों null वापसी (कोई नहीं प्रोटोकॉल का समर्थन), तो DriverManager त्रुटि के साथ एक SQLException फेंक होगा "No suitable driver found for <url>"

तो classpath पर एक से अधिक चालकों होने नहीं करता है बात जब तक वे अलग प्रोटोकॉल का समर्थन के रूप में, हालांकि, अगर वहाँ के लिए कई ड्राइवरों हैं एक ही डेटाबेस (या कम से कम: समान प्रोटोकॉल उपसर्ग), यह ड्राइवरों की सूची में सबसे पहले उपयोग करेगा, और यदि वह ड्राइवर SQLException के साथ विफल रहता है, तो यह दूसरे की कोशिश नहीं करेगा।

0

जेडीबीसी 4 में, ड्राइवर स्वचालित रूप से पंजीकृत होते हैं। यह कैसे होता है? जब हम

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/sonoo","root","root"); 

बारे में इस DriverManager वर्ग के भीतर स्थिर ब्लॉक कॉल करेंगे। आप DriverManager स्रोत फ़ाइल को खोलने हैं, तो आप स्थिर ब्लॉक देख सकते हैं

static { 
     loadInitialDrivers(); 
     println("JDBC DriverManager initialized"); 
    } 

इस समारोह loadInitialDrivers(); फ़ंक्शन को कॉल करें और सभी चालकों और स्वचालित रूप से पंजीकृत लोड होगा। तो हमें ड्राइवरों को स्पष्ट रूप से पंजीकृत या लोड करने की आवश्यकता नहीं है।