क्यों हम एक DriverManager के बजाय एक DataSource का उपयोग करते हैं?


89

मैं जावा JDBC विनिर्देश (vr। 4) पढ़ रहा हूं और मैंने इस कथन का सामना किया है:

DataSource - यह इंटरफ़ेस JDBC 2.0 वैकल्पिक पैकेज एपीआई में पेश किया गया था। यह DriverManager पर पसंद किया जाता है क्योंकि यह अंतर्निहित डेटा स्रोत के बारे में विवरण को अनुप्रयोग के लिए पारदर्शी होने की अनुमति देता है

क्या मैं समझने की कोशिश कर रहा हूँ क्या फर्क एक के बीच है Connectionऔर एक DataSourceऔर कारण है कि यह मौजूद है। मेरा मतलब है कि ऊपर दिया गया ब्लॉक कहता है कि डेटा स्रोत के बारे में विवरण एप्लिकेशन के लिए पारदर्शी है, लेकिन किसी प्रॉपर्टी फ़ाइल में डेटाबेस गुण जैसे कि उपयोगकर्ता नाम, पासवर्ड, यूआरएल आदि को बाहरी नहीं करेगा और फिर उसी तरह से DriverManager का उपयोग करें?

और क्या DataSourceइंटरफेस केवल कनेक्शन लौटने का एक सामान्य तरीका है जिसे पूल किया जा सकता है आदि? जावा ईई में, क्या एप्लिकेशन सर्वर इस इंटरफेस को लागू करता है और एक कनेक्शन के बजाय एक डेटा स्रोत का संदर्भ देने के लिए तैनात किए गए एप्लिकेशन?

जवाबों:


72

बेहतर मापनीयता और रखरखाव

DriverManagerडीबी से जुड़ने और कनेक्शन प्राप्त करने के लिए आपको सभी विवरणों (होस्ट, पोर्ट, उपयोगकर्ता नाम, पासवर्ड, ड्राइवर वर्ग) को जानना होगा। प्रॉपर्टीज़ फ़ाइल में उन लोगों को बाहरी बनाना इस तथ्य के बारे में कुछ भी नहीं बदलता है कि आपको उन्हें जानने की आवश्यकता है।

DataSourceआप का उपयोग केवल JNDI नाम जानने की जरूरत है। AppServer विवरण के बारे में परवाह करता है और क्लाइंट एप्लिकेशन के विक्रेता द्वारा कॉन्फ़िगर नहीं किया जाता है, लेकिन एक व्यवस्थापक द्वारा जहां एप्लिकेशन होस्ट किया जाता है।

अनुमापकता:

मान लीजिए कि आपको स्वयं कनेक्शन बनाने की आवश्यकता है, तो आप बदलते लोड से कैसे निपटेंगे, कभी-कभी आपके पास 10 उपयोगकर्ता हैं जो आपके पास 1000 हैं, तो आपको बस एक कनेक्शन नहीं मिल सकता है जब भी आपको एक की आवश्यकता होती है और बाद में इसे रिलीज़ किया जाता है ताकि डेटाबेस सर्वर न हो कनेक्शन से बाहर निकलें, जो आपको कनेक्शन पूलिंग की ओर ले जाता है। DriverManagerयह प्रदान नहीं करता है, DataSourceकरता है।

यदि आप स्वयं एक कनेक्शन पूल प्रोग्राम करने जा रहे हैं तो आपको उपयोग करना होगा DriverManager, अन्यथा साथ जाएं DataSource


4
Datasource इम्प्लांटेशन ड्राइवर विक्रेता द्वारा प्रदान किया जाता है (मान लें कि MySQL)। ड्राइवर को डेटास्रोत बनाने में सक्षम होने के लिए परिचालक को पता होना चाहिए। उसके बाद इसे जेएनडीआई नाम (तार्किक नाम) से कॉन्फ़िगर करने का ख्याल रखता है जिसे कॉन्फ़िगर किया गया है। ध्यान दें कि इस कॉन्फ़िगरेशन के लिए सभी विवरणों (ड्राइवर वर्ग, यूआरएल, उपयोगकर्ता नाम, पासवर्ड आदि) को जानना होगा। लेकिन यह अभी भी क्लाइंट एप्लिकेशन द्वारा इन ज्ञात होने से बेहतर है।
A4L

4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- क्या आपने नाम फ्लिप किए?
अरुण

3
@ वरुण मुझे ऐसा नहीं लगता, DriverManager DataSource की तुलना में निम्न स्तर का API है।
A4L

9
@CodeChieftain मुझे लगता है कि उसका मतलब है, अगर आप खुद एक कनेक्शन पूल लागू करना चाहते हैं, तो फ्लिप करने के लिए कुछ भी नहीं है।
कोरे तुगे

2
Datasource कनेक्शन मतदान प्रदान करता है। अंतिम वक्तव्य में कहा गया है कि यदि आप प्रोग्राम कनेक्शन मतदान करना चाहते हैं तो DataManager के लिए जाएं। यह पहली बार में भ्रामक हो सकता है। यदि आप अपने ऐप में डेटा पोल के लिए जाना चाहते हैं तो यह होना चाहिए।
अनिकेत ठाकुर

38

DriverManager

  • कनेक्शन के प्रदर्शन को बाधित करता है क्योंकि कनेक्शन जावा कक्षाओं में बनाए / बंद किए जाते हैं।
  • कनेक्शन पूलिंग का समर्थन नहीं करता है।

DataSource

  • कनेक्शन के प्रदर्शन को बेहतर बनाता है क्योंकि कनेक्शन एक वर्ग के भीतर निर्मित / बंद नहीं किए जाते हैं, उन्हें एप्लिकेशन सर्वर द्वारा प्रबंधित किया जाता है और रनटाइम के दौरान लाया जा सकता है।
  • यह कनेक्शन का एक पूल बनाने की सुविधा प्रदान करता है
  • उद्यम अनुप्रयोगों के लिए उपयोगी

लेकिन अगर आपने MyConnectionPool जैसी अपनी खुद की क्लास बनाई है और DriverManager के साथ इसके अंदर कुछ जादू किया है, तो क्या वह उस वर्ग का उपयोग करने के समान होगा जो डेटा स्रोत इंटरफ़ेस को लागू करता है? क्या DataSource इंटरफ़ेस केवल एक कनेक्शन प्राप्त करने के लिए एक सामान्य इंटरफ़ेस रखने के लिए है?
लकीलुके

1
ठीक वैसा ही नहीं। वसंत की तरह श्रमसाध्य डेटा स्रोत की क्षमता और इसके प्रदर्शन को दर्शाता है।
Nav0611

3

नीचे दिए गए कोड कनेक्शन पाने के लिए दो तरीके दिखाते हैं।

जैसा mySqlDataSourceकि इस पंक्ति में टिप्पणी की गई है, URL के बारे में जानने की कोई आवश्यकता नहीं है।

public class MySqlDataSourceTest {

public static void main(String[] args) throws SQLException, ClassNotFoundException {


    /************** using MysqlDataSource starts **************/
    MysqlDataSource d = new MysqlDataSource();
    d.setUser("root");
    d.setPassword("root");
//  d.setUrl("jdbc:mysql://localhost:3306/manavrachna");
    d.setDatabaseName("manavrachna");
    Connection c =  (Connection) d.getConnection();
    /************** using MysqlDataSource ends**************/


    /************** using DriverManager start **************/
    Class.forName("com.mysql.jdbc.Driver");
    Connection c=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/manavrachna","root","root");
    /************** using DriverManager ends **************/

    Statement st=(Statement) c.createStatement();
    ResultSet rs=st.executeQuery("select id from employee");
    while(rs.next())
    {
        System.out.println(rs.getInt(1));
    }

}

}

2

DataSourceऑब्जेक्ट कनेक्शन पूलिंग और वितरित लेनदेन प्रदान कर सकते हैं, इसलिए DataSourceयदि आपको इन दोनों में से किसी एक या दोनों विशेषताओं की आवश्यकता है , तो आपको इसका उपयोग करना पड़ सकता है।


पक्ष में मत देना। 'वितरित लेनदेन' अन्य उत्तरों में एक लापता बिंदु है
远 Lu शेंगयुआन लू

1

हम निम्नानुसार एक डेटा स्रोत का उपयोग करके कनेक्शन प्राप्त कर सकते हैं। किसी भी डेटाबेस क्वेरी को करने के लिए कनेक्शन का उपयोग करें।

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.