7.1 कनेक्शन पूल

आज आपण डेटाबेससह आणखी व्यावसायिकपणे कसे कार्य करावे हे शिकू. आणि आता आपण इंग्रजीमध्ये थ्रेड पूल किंवा कनेक्शन पूलबद्दल बोलू .

डेटाबेसशी कनेक्ट होण्यास थोडा वेळ लागतो. विशेषत: डेटाबेस रिमोट असल्यास. जर आम्ही प्रत्येक विनंतीसाठी डेटाबेसशी जोडणी केली, तर आमच्या अर्जाच्या प्रतिसादाची गती आश्चर्यकारकपणे मंद होईल. ते वापरतील संसाधने उल्लेख नाही.

अशा समस्यांवर उपाय म्हणून, काही सेटमध्ये बेसशी कनेक्शन संग्रहित करण्याचा प्रस्ताव होता, ज्याला थ्रेड पूल म्हणतात.

जेव्हा आम्ही नवीन कनेक्शनची विनंती करतो, तेव्हा कनेक्शन पूल ते तयार करतो आणि जेव्हा बंद होते तेव्हा ते ते बंद करत नाही, परंतु कनेक्शन पूलमध्ये ते जतन करते. आणि आम्ही कनेक्शन पूलमधून पुन्हा कनेक्शनची विनंती केल्यास, ते आम्हाला नवीन तयार करण्याऐवजी जुन्यापैकी एक देईल.

खरं तर, ऍप्लिकेशन एका विशेष ड्रायव्हरद्वारे कार्य करते, जे नियमित JDBC ड्रायव्हरसाठी रॅपर आहे आणि ज्यामध्ये पूलसह काम करण्यासाठी अतिरिक्त कार्यक्षमता आहे. ही परिस्थिती खालीलप्रमाणे दर्शविली जाऊ शकते:

कनेक्शन पूल

प्रोग्रामर कनेक्शन पूलसाठी सेटिंग्ज व्यक्तिचलितपणे सेट करू शकतो: सक्रिय कनेक्शनची संख्या, कालबाह्य इ.

विशेषतः अत्यंत परिस्थितीसाठी, तुम्ही तुमचा स्वतःचा कनेक्शन पूल लिहू शकता: एक वर्ग ज्यामध्ये कनेक्शनची सूची असेल. हे क्लोज फंक्शन ओव्हरराइड करेल, जे कनेक्शनला सूचीमध्ये परत करेल आणि ओपन कनेक्शन टाइमर सारख्या इतर अनेक वस्तू असतील. बराच वेळ कनेक्शन नसताना कनेक्शन बंद होते.

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

थ्रेड पूल सहसा डेटासोर्स ऑब्जेक्टसह एकत्रितपणे कार्य करतो. या ऑब्जेक्टचा रिमोट डेटाबेसचा अमूर्तता म्हणून विचार केला जाऊ शकतो. डेटा स्त्रोत नावाचे अक्षरशः डेटा स्त्रोत म्हणून भाषांतर केले जाऊ शकते. जो एक प्रकारचा इशारा आहे.

डेटाबेसशी भौतिक कनेक्शन मिळविण्यासाठी डेटास्रोत ऑब्जेक्ट्सचा वापर केला जातो आणि ड्रायव्हर मॅनेजरचा पर्याय आहे. JDBC ड्रायव्हरची नोंदणी करण्याची गरज नाही. कनेक्शन स्थापित करण्यासाठी आपल्याला फक्त योग्य पॅरामीटर्स सेट करण्याची आवश्यकता आहे आणिgetConnection() पद्धत कार्यान्वित करा.

स्थानिकरित्या (थेट ऍप्लिकेशनमध्ये) डेटासोर्स प्रकाराचा ऑब्जेक्ट तयार करताना, JDBC ड्रायव्हर प्रदात्याद्वारे प्रदान केलेल्या योग्य पद्धतींद्वारे कनेक्शन पॅरामीटर्स सेट केले जातात. या पद्धती डेटासोर्स इंटरफेसद्वारे परिभाषित केल्या जात नाहीत, कारण भिन्न विक्रेत्यांकडून DBMS शी कनेक्ट करण्यासाठीचे पॅरामीटर्स प्रकार आणि संख्येमध्ये भिन्न असू शकतात (उदाहरणार्थ, सर्व DBMS ला ड्रायव्हर किंवा नेटवर्क प्रोटोकॉलचा प्रकार निर्दिष्ट करणे आवश्यक नसते).

अशा प्रकारे, Oracle DBMS सोबत काम करताना, संबंधित संच वापरण्यासाठी आणि पद्धती मिळवण्यासाठी, OracleDataSource प्रकाराचा ऑब्जेक्ट मिळवणे आवश्यक आहे, जे डेटास्रोत इंटरफेस लागू करणाऱ्या समान नावाच्या वर्गाचे उदाहरण आहे. म्हणून, डेटासोर्स प्रकारातील ऑब्जेक्ट्स तयार करण्याचा हा मार्ग तुमचा कोड कमी पोर्टेबल बनवतो आणि ड्रायव्हरच्या विशिष्ट अंमलबजावणीवर कमी अवलंबून असतो.

डेटासोर्स प्रकारातील ऑब्जेक्ट्सचा स्थानिक वापर स्पष्ट करणारे कोडचे उदाहरण खालीलप्रमाणे आहे.

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 इंटरफेस

JNDI इंटरफेसच्या वापरासह डेटासोर्स प्रकारातील ऑब्जेक्ट्सच्या पूर्ण क्षमता प्रकट होतात. मोठ्या सर्व्हर ऍप्लिकेशन्ससाठी जेएनडीआय ही एक विशेष सेवा (डिरेक्टरीसारखी) आहे जी एका सेवेला दुसऱ्या सेवेशी कनेक्शन स्थापित करण्यास अनुमती देते.

नाव आणि निर्देशिका सेवेचा वापर केल्याने तुम्हाला पूर्वनिर्धारित कनेक्शन पॅरामीटर्ससह सिस्टम अ‍ॅडमिनिस्ट्रेटरने यापूर्वी तयार केलेल्या डेटासोर्स प्रकारातील वस्तू संग्रहित करण्याची परवानगी मिळते. सूर्याने विकसित केलेली काही मानक मालमत्ता (मापदंड) नावे खालीलप्रमाणे आहेत:

मालमत्तेचे नाव Java डेटा प्रकार उद्देश
डेटाबेसनाव स्ट्रिंग डेटाबेस नाव
सर्व्हरनाव स्ट्रिंग सर्व्हरचे नाव
वापरकर्ता स्ट्रिंग वापरकर्तानाव (आयडी)
पासवर्ड स्ट्रिंग वापरकर्ता संकेतशब्द
portNumber int DBMS सर्व्हर पोर्ट क्रमांक

J2EE घटक तंत्रज्ञानावर आधारित बहु-स्तरीय एंटरप्राइझ ऍप्लिकेशन्सच्या विकासामध्ये डेटासोर्स आणि JNDI इंटरफेसचे संयोजन महत्त्वाची भूमिका बजावते.

तुम्ही तुमच्या ऍप्लिकेशन कोडमध्ये डेटासोर्स आणि JNDI इंटरफेसचे संयोजन वापरत असल्यास, तुम्हाला फक्त नामकरण आणि निर्देशिका सेवेकडून डेटासोर्स प्रकारच्या ऑब्जेक्टची विनंती करावी लागेल. या प्रकरणात, कनेक्शनचे तपशील आणि ड्रायव्हरच्या विशिष्ट अंमलबजावणीवर अवलंबून असलेला प्रोग्राम कोड नाव आणि निर्देशिका सेवेमध्ये संग्रहित केलेल्या ऑब्जेक्टमधील अनुप्रयोगापासून लपविला जातो.

अशा प्रकारे, डेटासोर्स आणि जेएनडीआय प्रकारातील ऑब्जेक्ट्सच्या शेअरिंगमध्ये दोन पायऱ्यांचा समावेश होतो जे एकमेकांपासून स्वतंत्रपणे पार पाडले जातात:

  1. Context.bind()तुम्ही वापरून नामकरण आणि निर्देशिका सेवेमध्ये DataSource प्रकारातील नामांकित ऑब्जेक्ट संग्रहित करणे आवश्यक आहे 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 कनेक्शन पूल उदाहरणे

आपण जिथे सुरुवात केली होती तिथे परत जाऊया - कनेक्शन पूल.

जावा प्रोग्रामर त्यांच्या प्रोग्राममध्ये बरेचदा लायब्ररी वापरतात ज्यामध्ये कनेक्शन पूलची विविध अंमलबजावणी असते. त्यापैकी तीन सर्वात लोकप्रिय आहेत:

  • Apache Commons DBCP
  • C3PO
  • HikariCP

Apache प्रकल्प हा एक चांगला कनेक्शन पूल तयार करणारा पहिला होता, तो Tomcat वेब सर्व्हरमध्ये देखील वापरला जातो. त्याच्यासह कार्य करण्याचे उदाहरणः

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 हे नाव Star Wars मधील c3po रोबोटचा संदर्भ आहे. आणि कनेक्शन पूलसाठी CP देखील लहान आहे.

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(){}
}

हे त्याचे अधिकृत GitHub पृष्ठ आहे .

आणि कॉन्फिगरेशन वर एक चांगला लेख .