Apache Derby হল একটি Java-ভিত্তিক এমবেডেড ডেটাবেস, যা সাধারণত একক থ্রেডেড অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়। তবে, আপনি multi-threaded পরিবেশে বা একাধিক থ্রেডের সাথে এর ব্যবহার করতে পারবেন, তবে এর জন্য কিছু গুরুত্বপূর্ণ বিষয় লক্ষ্য রাখতে হবে, কারণ ডেটাবেসের এমবেডেড নেচার এবং ACID (Atomicity, Consistency, Isolation, Durability) বৈশিষ্ট্যসমূহ ঠিকভাবে পরিচালনা করা প্রয়োজন।
নিচে multi-threaded পরিবেশে Apache Derby ব্যবহার করার সময় কিছু প্রধান বিষয় এবং পরামর্শ দেওয়া হলো:
Apache Derby thread-safe নয়, যার মানে হল যে এটি একাধিক থ্রেডের মাধ্যমে একে অপরের সাথে প্রতিযোগিতা করে একে অপরকে প্রভাবিত করতে পারে। Derby, যখন একাধিক থ্রেড থেকে অ্যাক্সেস করা হয়, তখন ডেটাবেসের উপর প্রতিযোগিতা এবং ডেটা সমন্বয় সমস্যাগুলি তৈরি হতে পারে।
Connection
অবজেক্ট ব্যবহার না করলে thread interference এবং data corruption হতে পারে।Connection
থ্রেডেএকটি গুরুত্বপূর্ণ বিষয় হলো, একটি Connection
অবজেক্ট একাধিক থ্রেডের মধ্যে ভাগ না করা। প্রতিটি থ্রেডের জন্য আলাদা Connection
অবজেক্ট ব্যবহার করা উচিত।
public class DerbyThreadExample extends Thread {
public void run() {
try {
// প্রতিটি থ্রেডে আলাদা Connection তৈরি
Connection conn = DriverManager.getConnection("jdbc:derby:myDB;create=true");
// SQL স্টেটমেন্ট
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO employee VALUES (1, 'John')");
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// কয়েকটি থ্রেড শুরু করা
for (int i = 0; i < 10; i++) {
Thread thread = new DerbyThreadExample();
thread.start();
}
}
}
Connection
pooling ব্যবহার করুনএকাধিক থ্রেডের মধ্যে Connection
অবজেক্ট শেয়ার করতে না চাওয়াটা ঠিক হতে পারে, তবে এই সমস্যা সমাধান করতে connection pooling ব্যবহৃত হতে পারে। এতে প্রতিটি থ্রেডের জন্য Connection
সঠিকভাবে ব্যবস্থাপনা করা যায় এবং প্রতিটি থ্রেড আলাদা Connection
পায়। DataSource
এবং Connection Pooling
লাইব্রেরি যেমন Apache DBCP, C3P0 ইত্যাদি ব্যবহার করা যেতে পারে।
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");
dataSource.setUrl("jdbc:derby:myDB;create=true");
dataSource.setUsername("user");
dataSource.setPassword("password");
Connection conn = dataSource.getConnection();
এই কৌশলটি multi-threaded পরিবেশে ভালো পারফরম্যান্স এবং সঠিক ডেটাবেস কনেকশন ম্যানেজমেন্ট নিশ্চিত করে।
যেহেতু Apache Derby ACID ট্রানজেকশন সাপোর্ট করে, তাই একাধিক থ্রেডে একাধিক ট্রানজেকশন পরিচালনা করার সময় transaction isolation level ঠিকভাবে সেট করা গুরুত্বপূর্ণ। একাধিক থ্রেড যখন ডেটাবেসে একাধিক রিড/রাইট অপারেশন করে, তখন থ্রেডের মধ্যে data consistency বজায় রাখার জন্য ট্রানজেকশন ম্যানেজমেন্ট অত্যন্ত গুরুত্বপূর্ণ।
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
conn.setAutoCommit(false);
// SQL অপারেশন
conn.commit();
এটি ট্রানজেকশন নিরাপত্তা বজায় রাখে এবং একাধিক থ্রেডের মধ্যে ডেটার কনসিস্টেন্সি বজায় রাখতে সাহায্য করে।
Derby একটি pessimistic locking পদ্ধতি ব্যবহার করে, যেখানে ডেটাবেসের ওপর exclusive locks নেওয়া হয়। কিন্তু একাধিক থ্রেড যদি একই টেবিলের ওপর একসাথে কাজ করতে চায়, তবে লকিং সমস্যা হতে পারে।
SELECT FOR UPDATE
ব্যবহার করুন, যা রেকর্ডগুলোর উপর এক্সক্লুসিভ লক রাখে।conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
stmt.executeUpdate("SELECT * FROM employee FOR UPDATE");
conn.commit();
Connection
ব্যবহার করা উচিত।এটি একটি কার্যকর multi-threaded পরিবেশে Apache Derby ব্যবহারের জন্য গুরুত্বপূর্ণ কৌশল এবং নির্দেশনা।