2015-01-29 6 views
6

मैं यहाँ ताकि पर पढ़ा है जावा 6 क्योंकि आप अब JDBC ड्राइवर रजिस्टर करने के लिए का उपयोग कर की जरूरत है:कक्षा .forName (JDBC_DRIVER) की अब आवश्यकता नहीं है?

Class.forName(JDBC_DRIVER); 

क्योंकि DriverManager प्रणाली संपत्ति में स्थित पथ का उपयोग करता "jdbc.drivers" पुनः प्राप्त करने के सही चालक

लेकिन जब मैं followng कार्य करें:

System.out.print(System.getProperty("jdbc.drivers")); 

null मुद्रित हो जाता है।

क्या आपके पास कोई संकेत है कि मेरा ऐप सही तरीके से क्यों काम करता है ?? ;)

+2

यह सब दस्तावेज में विस्तार से बताया है: http://docs.oracle.com/javase/7/docs/api/java/sql/ DriverManager.html –

उत्तर

9

इसका उस सिस्टम प्रॉपर्टी के साथ कुछ लेना देना नहीं है। जावा 6 (और जेडीबीसी 4) ने एक अवधारणा पेश की जिसे "service provider" कहा जाता है, जहां स्टार्टअप के दौरान JVM द्वारा ज्ञात इंटरफ़ेस के कार्यान्वयन का पता लगाया जा सकता है। एक ड्राइवर जो इसके अनुरूप है स्वचालित रूप से DriverManager द्वारा पंजीकृत किया जाएगा। यही कारण है कि Class.forName() अब आवश्यक नहीं है - लेकिन केवल अगर ड्राइवर इसका समर्थन करता है।

सेवा पंजीकरण शुरू किया गया है यदि META-INF निर्देशिका के अंदर ड्राइवर की जार फ़ाइल में services निर्देशिका है। उस निर्देशिका में एक जेडीबीसी ड्राइवर के मामले में कार्यान्वित इंटरफ़ेस के नाम से एक टेक्स्ट फ़ाइल होना आवश्यक है जो लागू करने वाले वर्ग वाले java.sql.Driver है।

+1

इसका मतलब है कि मुझे बस इतना करना है कि मेरा जेडीबीसी जार कार्यान्वयन इंगित करें, है ना? अगर मैं और जेडीबीसी कार्यान्वयन को इंगित करता हूं तो क्या होगा? – GionJh

+2

@ user986437 हां, कक्षापथ पर एक जेडीबीसी 4 ड्राइवर जोड़ना पर्याप्त है। मैंने कई ड्राइवरों के साथ प्रयास नहीं किया है, लेकिन मुझे लगता है कि सही एक यूआरएल पर निर्भर किया जाएगा (प्रत्येक ड्राइवर एक अलग यूआरएल का समर्थन करता है)। – Puce

+1

यह जेडीबीसी 4 जेडीबीसी 3 नहीं है, जिसने मैकेनिम पेश किया; http://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html#package.description – Puce

2

DriverManager की Javadocs से:

इसके प्रारंभ के हिस्से के रूप में, DriverManager वर्ग "jdbc.drivers" प्रणाली संपत्ति में संदर्भित ड्राइवर वर्गों को लोड करने का प्रयास करेंगे। यह उपयोगकर्ता को उनके अनुप्रयोगों द्वारा उपयोग किए जाने वाले जेडीबीसी ड्राइवर्स को अनुकूलित करने की अनुमति देता है। अपने ~/.hotjava/संपत्तियों में उदाहरण के लिए फ़ाइल आपके द्वारा निर्दिष्ट कर सकता है:

jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver 

इसका मतलब यह है कि इस प्रणाली संपत्ति निर्दिष्ट किया जाना चाहिए। यह नहीं कहता कि ड्राइवर पंजीकृत होने पर कक्षा स्वचालित रूप से इस संपत्ति को भर देगी।

आपका आवेदन क्यों काम कर रहा है, आप यह जांचना चाहेंगे कि क्या आप पहले से ही DriverManager#registerDriver() विधि को कॉल कर रहे हैं (हालांकि अधिकांश ड्राइवरों के लिए इसकी आवश्यकता नहीं है)। यदि हां, तो ड्राइवर पंजीकृत है।

DriverManager तरीकों getConnection और getDrivers जावा मानक संस्करण सेवा प्रदाता तंत्र का समर्थन करने के बढ़ाया गया है: अन्यथा, आवेदन में उल्लेख किया है के रूप में एक सेवा प्रदाता फ़ाइल हो सकता है,। जेडीबीसी 4.0 ड्राइवर्स में फाइल META-INF/services/java.sql.Driver शामिल होनी चाहिए। इस फ़ाइल में java.sql.Driver के जेडीबीसी ड्राइवर कार्यान्वयन का नाम शामिल है। उदाहरण के लिए, my.sql.Driver class लोड करने के लिए, META-INF/services/java.sql.Driver फ़ाइल प्रविष्टि होते हैं:

+0

आपको 'रजिस्टर ड्रायवर' विधि को स्वयं नहीं बुलाया जाना चाहिए, इसे लोड होने पर जेडीबीसी ड्राइवर कार्यान्वयन द्वारा स्वयं को बुलाया जाना है। एकमात्र असली अपवाद यह है कि यदि आप ऐसे ड्राइवर का उपयोग करते हैं जो स्वयं पंजीकृत नहीं होता है (और लगभग सभी जेडीबीसी ड्राइवर लोड होने पर खुद को पंजीकृत करते हैं, शायद विशेष उद्देश्य (मुख्यधारा नहीं) ड्राइवरों के अपवाद के साथ)। –

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