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 ইন্টারফেসের ব্যবহারের সাথে সংমিশ্রণে উদ্ভাসিত হয়। JNDI হল বড় সার্ভার অ্যাপ্লিকেশনগুলির জন্য একটি বিশেষ পরিষেবা (একটি ডিরেক্টরির মতো কিছু) যা একটি পরিষেবাকে অন্য পরিষেবার সাথে সংযোগ স্থাপন করতে দেয়৷

নাম এবং ডিরেক্টরি পরিষেবা ব্যবহার করে আপনাকে পূর্বনির্ধারিত সংযোগ পরামিতি সহ সিস্টেম অ্যাডমিনিস্ট্রেটর দ্বারা তৈরি ডেটাসোর্স ধরণের অবজেক্টগুলি সংরক্ষণ করার অনুমতি দেয়। নিম্নলিখিত কিছু স্ট্যান্ডার্ড প্রপার্টি (প্যারামিটার) নামগুলি সান দ্বারা তৈরি করা হয়েছে:

সম্পত্তির নাম জাভা ডেটা টাইপ উদ্দেশ্য
ডাটাবেসের নাম স্ট্রিং ডাটাবেসের নাম
সার্ভার নাম স্ট্রিং সার্ভার নাম
ব্যবহারকারী স্ট্রিং ব্যবহারকারীর নাম (আইডি)
পাসওয়ার্ড স্ট্রিং ব্যবহারকারী পাসওয়ার্ড
পোর্ট নাম্বার int DBMS সার্ভার পোর্ট নম্বর

ডেটাসোর্স এবং JNDI ইন্টারফেসের সমন্বয় J2EE কম্পোনেন্ট প্রযুক্তির উপর ভিত্তি করে মাল্টি-টায়ার এন্টারপ্রাইজ অ্যাপ্লিকেশনগুলির বিকাশে একটি মূল ভূমিকা পালন করে।

আপনি যদি আপনার অ্যাপ্লিকেশন কোডে ডেটাসোর্স এবং 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 এর কাজ বিশ্লেষণ করব না। এটি এই কোর্সের সুযোগের বাইরে। আমি শুধু আপনাকে জানতে চাই যে এই পদ্ধতিটি বড় অ্যাপ্লিকেশনগুলিতে খুব সাধারণ। আপনি যদি ভবিষ্যতে এই ধরনের কোড দেখতে পান তাহলে হারিয়ে যাবেন না।

এটা কিভাবে কাজ করে এটা কোন ব্যাপার না. আপনাকে শুধু জানতে হবে যে একটি JNDI পরিষেবার মাধ্যমে আপনি পরিষেবা ডিরেক্টরিতে নিবন্ধিত যেকোনো পরিষেবার প্রক্সি অবজেক্ট পেতে পারেন। এইভাবে আপনি ডেটাসোর্স অবজেক্ট পাবেন এবং ডাটাবেসের সাথে কাজ করতে এটি ব্যবহার করুন।

7.4 সংযোগ পুলের উদাহরণ

আসুন আমরা যেখানে শুরু করেছি সেখানে ফিরে যাই - সংযোগ পুল।

জাভা প্রোগ্রামাররা তাদের প্রোগ্রামগুলিতে প্রায়শই লাইব্রেরি ব্যবহার করে যাতে সংযোগ পুলের বিভিন্ন বাস্তবায়ন রয়েছে। তাদের মধ্যে তিনটি সর্বাধিক জনপ্রিয়:

  • Apache Commons 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 রোবটের একটি রেফারেন্স। এবং সংযোগ পুলের জন্য 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 পৃষ্ঠা ।

এবং কনফিগারেশন একটি ভাল নিবন্ধ .