7.1 कनेक्शन पूल

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

डेटाबेस से जुड़ने में कुछ समय लगता है। खासकर अगर डेटाबेस रिमोट है। यदि हम प्रत्येक अनुरोध के लिए डेटाबेस से संबंध बनाते हैं, तो हमारे आवेदन की प्रतिक्रिया गति में अविश्वसनीय रूप से धीमी होगी। उन संसाधनों का उल्लेख नहीं करना जो इसका उपभोग करेंगे।

ऐसी समस्याओं के समाधान के रूप में, यह प्रस्तावित किया गया था कि आधार से कनेक्शन को कुछ सेट में संग्रहीत किया जाए, जिसे थ्रेड पूल कहा जाता है।

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

वास्तव में, एप्लिकेशन एक विशेष ड्राइवर के माध्यम से काम करता है, जो एक नियमित JDBC ड्राइवर के लिए एक आवरण है और जिसमें पूल के साथ काम करने के लिए अतिरिक्त कार्यक्षमता है। इस स्थिति का प्रतिनिधित्व इस प्रकार किया जा सकता है:

कनेक्शन पूल

प्रोग्रामर कनेक्शन पूल के लिए मैन्युअल रूप से सेटिंग्स सेट कर सकता है: सक्रिय कनेक्शन की संख्या, टाइमआउट इत्यादि।

विशेष रूप से चरम स्थितियों के लिए, आप अपना स्वयं का कनेक्शन पूल लिख सकते हैं: एक वर्ग जिसमें कनेक्शनों की सूची होगी। यह क्लोज फ़ंक्शन को ओवरराइड करेगा, जो कनेक्शन को वापस सूची में लौटा देगा, और ओपन कनेक्शन टाइमर जैसी कई अन्य अच्छाइयाँ होंगी। लंबे समय तक कोई कनेक्शन नहीं होने पर कनेक्शन बंद कर दिया जाता है।

7.2* इंटरफ़ेस डेटा स्रोत और कनेक्शन पूल डेटा स्रोत

थ्रेड पूल आमतौर पर डेटासोर्स ऑब्जेक्ट के साथ मिलकर काम करता है। इस वस्तु को दूरस्थ डेटाबेस के अमूर्त के रूप में माना जा सकता है। डेटा स्रोत नाम का शाब्दिक रूप से डेटा स्रोत के रूप में अनुवाद किया जा सकता है। जो एक तरह का इशारा है।

DataSource ऑब्जेक्ट्स का उपयोग डेटाबेस से भौतिक कनेक्शन प्राप्त करने के लिए किया जाता है और यह DriverManager का एक विकल्प है। JDBC ड्राइवर को पंजीकृत करने की कोई आवश्यकता नहीं है। कनेक्शन स्थापित करने के लिए आपको केवल उचित पैरामीटर सेट करने की आवश्यकता है औरgetConnection() विधि निष्पादित करें.

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

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

निम्नलिखित डेटा स्रोत प्रकार की वस्तुओं के स्थानीय उपयोग को दर्शाने वाला एक कोड उदाहरण है।

import java.sql.*;
import javax.sql.*;
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;

public class DataSource {
    public static void main(String[] args) {
    	try {
        	OracleDataSource ods = new OracleDataSource();

        	ods.setUser("root");
        	ods.setPassword("secret");
        	ods.setDriverType("thin");
        	ods.setDatabaseName("test");
        	ods.setServerName("localhost");
        	ods.setPortNumber(1521);

        	Connection connection = ods.getConnection();
        	System.out.println("Connection successful!!!");

    	} catch (SQLException se) {
        	se.printStackTrace();
    	}
    	System.out.println("Goodbye!");
	}
}

7.3 * जेएनडीआई इंटरफेस

JNDI इंटरफ़ेस के उपयोग के संयोजन में DataSource प्रकार की वस्तुओं की पूर्ण क्षमता प्रकट होती है। JNDI बड़े सर्वर अनुप्रयोगों के लिए एक विशेष सेवा (निर्देशिका जैसा कुछ) है जो एक सेवा को दूसरे के साथ संबंध स्थापित करने की अनुमति देता है।

नाम और निर्देशिका सेवा का उपयोग करने से आप पूर्वनिर्धारित कनेक्शन पैरामीटर के साथ सिस्टम व्यवस्थापक द्वारा पहले बनाए गए डेटा स्रोत प्रकार की वस्तुओं को संग्रहीत कर सकते हैं। सन द्वारा विकसित कुछ मानक गुण (पैरामीटर) नाम निम्नलिखित हैं:

संपत्ति का नाम जावा डेटा प्रकार उद्देश्य
डेटाबेस का नाम डोरी डेटाबेस का नाम
सर्वर का नाम डोरी सर्वर का नाम
उपयोगकर्ता डोरी प्रयोक्ता नाम / आईडी)
पासवर्ड डोरी उपयोगकर्ता पासवर्ड
पोर्ट नंबर int यहाँ DBMS सर्वर पोर्ट नंबर

DataSource और JNDI इंटरफेस का संयोजन J2EE घटक प्रौद्योगिकी पर आधारित बहु-स्तरीय उद्यम अनुप्रयोगों के विकास में महत्वपूर्ण भूमिका निभाता है।

यदि आप अपने एप्लिकेशन कोड में डेटासोर्स और जेएनडीआई इंटरफेस के संयोजन का उपयोग करते हैं, तो आपको केवल नामकरण और निर्देशिका सेवा से डेटासोर्स प्रकार की वस्तु का अनुरोध करने की आवश्यकता है। इस मामले में, ड्राइवर के एक विशेष कार्यान्वयन पर निर्भर कनेक्शन और प्रोग्राम कोड का विवरण नाम और निर्देशिका सेवा में संग्रहीत ऑब्जेक्ट में एप्लिकेशन से छिपा हुआ है।

इस प्रकार, DataSource और JNDI प्रकार की वस्तुओं को साझा करने में दो चरण शामिल होते हैं जो एक दूसरे से स्वतंत्र रूप से किए जाते हैं:

  1. आपको नामकरण और निर्देशिका सेवा में डेटा स्रोत प्रकार के नामित ऑब्जेक्ट Context.bind()को javax.naming.
  2. . का उपयोग करके एप्लिकेशन में नामकरण और निर्देशिका सेवा से डेटा स्रोत प्रकार के ऑब्जेक्ट का अनुरोध करें Context.lookup()। उसके बाद, आप DataSource.getConnection()डेटाबेस से कनेक्शन प्राप्त करने के लिए इसकी विधि का उपयोग कर सकते हैं।

निम्नलिखित JNDI इंटरफ़ेस और OracleDataSource प्रकार के ऑब्जेक्ट का एक साथ उपयोग करने का एक उदाहरण है।

// Create a key JNDI object
Hashtable env = new Hashtable();
env.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
env.put (Context.PROVIDER_URL, "file:JNDI");
Context ctx = new InitialContext(env);

// Get the DataSource object by its name
DataSource ods = (DataSource) ctx.lookup("myDatabase");

// Get the Connection from the DataSource object
Connection connection = ods.getConnection();
System.out.println("Connection successful!!!");

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

इससे कोई फर्क नहीं पड़ता कि यह कैसे काम करता है। आपको बस यह जानने की जरूरत है कि JNDI सेवा के साथ आप सेवा निर्देशिका में पंजीकृत किसी भी सेवा का प्रॉक्सी ऑब्जेक्ट प्राप्त कर सकते हैं। इस तरह आप डेटासोर्स ऑब्जेक्ट प्राप्त करते हैं और डेटाबेस के साथ काम करने के लिए इसका इस्तेमाल करते हैं।

7.4 कनेक्शन पूल उदाहरण

आइए वापस वहीं जाएं जहां से हमने शुरुआत की थी - कनेक्शन पूल।

जावा प्रोग्रामर अपने कार्यक्रमों में अक्सर उन पुस्तकालयों का उपयोग करते हैं जिनमें कनेक्शन पूल के विभिन्न कार्यान्वयन होते हैं। उनमें से तीन सबसे लोकप्रिय हैं:

  • अपाचे कॉमन्स DBCP
  • C3PO
  • हिकारीसीपी

Apache प्रोजेक्ट एक अच्छा कनेक्शन पूल बनाने वाला पहला था, इसका उपयोग टॉमकैट वेब सर्वर के अंदर भी किया जाता है। इसके साथ काम करने का एक उदाहरण:

public class DBCPDataSource {

    private static BasicDataSource ds = new BasicDataSource();
    static {
    	ds.setUrl("jdbc:h2:mem:test");
    	ds.setUsername("user");
    	ds.setPassword("password");
    	ds.setMinIdle(5);
    	ds.setMaxIdle(10);
    	ds.setMaxOpenPreparedStatements(100);
    }

    public static Connection getConnection() throws SQLException {
    	return ds.getConnection();
    }

    private DBCPDataSource(){ }
}

दूसरा बहुत लोकप्रिय पूल C3PO है । अजीब नाम, मैं सहमत हूँ। C3PO नाम स्टार वार्स के c3po रोबोट का एक संदर्भ है। और कनेक्शन पूल के लिए सीपी भी छोटा है।

public class C3p0DataSource {

    private static ComboPooledDataSource cpds = new ComboPooledDataSource();
    static {
    	try {
        	cpds.setDriverClass("org.h2.Driver");
        	cpds.setJdbcUrl("jdbc:h2:mem:test");
        	cpds.setUser("user");
        	cpds.setPassword("password");
    	} catch (PropertyVetoException e) {
            // handle the exception
    	}
    }

    public static Connection getConnection() throws SQLException {
    	return cpds.getConnection();
    }

    private C3p0DataSource(){}
}

इसके लिए दस्तावेज़ीकरण आधिकारिक पृष्ठ पर पाया जा सकता है ।

और अंत में, हमारे समय में सबसे लोकप्रिय कनेक्शन पूल HikariCP है :

public class HikariCPDataSource {

    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;

    static {
    	config.setJdbcUrl("jdbc:h2:mem:test");
    	config.setUsername("user");
    	config.setPassword("password");
    	config.addDataSourceProperty("cachePrepStmts", "true");
    	config.addDataSourceProperty("prepStmtCacheSize", "250");
    	config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
    	ds = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
    	return ds.getConnection();
    }

    private HikariCPDataSource(){}
}

यहां उनका आधिकारिक गिटहब पेज है ।

और विन्यास पर एक अच्छा लेख ।